7

几个月来,我一直在研究 C++,并且大部分时间都被谷歌指示堆栈溢出以进行 C++ 查询。我经常注意到“为什么不使用矢量”类型的劝告,并受到启发去做这件事。

因此,主要是为了获得自动内存释放的次要好处,并能够编写类型化的比较函数进行排序。我将指向对象的指针数组切换为向量。现在我认为(似乎不正确)向量可以或多或少地像数组一样使用,因此我这样初始化:

cluster  clusters[LOTS];
vector<cluster *> pclust;
pclust.reserve(numClust);
for (int i=0; i<numClust; ++i)
    pclust[i] = clusters + i;

编译器没有抱怨。然后一段时间后,我需要根据集群对象的某些属性对向量进行排序。所以:

std::sort(pclust.begin(), pclust.end(), ClusterCompareNumSegs);

再次编译没有问题。除了向量没有排序。事实证明 vector.size() 为零,当然我的初始化应该是

pclust.push_back(clusters + i);

现在这很容易解决,但我很困惑,因为最初的错误分配有效。我成功地遍历了向量 - 使用数组语法,如下所示:

for (clustind=0; clustind < numClust; ++clustind) {<br>
    cluster *cl = pclust[clustind];
    ...happily access *cl...

这一切都很好。所以我只是想知道发生了什么。大概在我最初的任务中,我试图访问尚未在向量中的元素(我试图将它们放入),并且向量抛出了我忽略的异常。但尽管如此,当引用位置时,指针就在那里。任何人都可以提供启示吗?

4

4 回答 4

11

vector::reserve不会改变向量的大小,它仍然只包含0创建它的元素。它的作用是确保向量可以保留numClust而无需重新分配。见这里

您想要的是将向量声明为具有该大小

vector<cluster *> pclust(numClust);

调整向量的大小

pclust.resize(numClust);
于 2012-05-30T07:59:48.623 回答
5

std::vector::reserve 要求为向量容器的元素分配的存储空间的容量至少足以容纳 n 个元素。它不会调整矢量的大小,就是std::vector::resize这样。

替换pclust.reserve(numClust);pclust.resize(numClust);

或者,您可以删除pclust.reserve(numClust);调用并将此向量的构造更改为:vector<cluster *> pclust(numClust);产生相同的结果。

我还建议你看看这个问题:std::vector reserve() 和 push_back() 比 resize() 和数组索引快,为什么?:)

于 2012-05-30T08:00:29.950 回答
0

与向量一起使用的 operator[] 返回对索引位置元素的引用。但是,你还没有用任何值初始化向量,所以它是空的。

尽管你做了 a pclust.reserve(numClust),但它只告诉向量的大小将很快改变,它分配存储空间而不改变向量的大小。

于 2012-05-30T08:02:01.897 回答
0
cluster  clusters[LOTS];
vector<cluster *> pclust(numClust);
for (int i = 0; i < numClust; ++i)
  pclust[i] = clusters + i;

但这意味着您仍在使用数组来存储集群。你不能做clusters一个矢量吗?

vector<cluster> clusters(LOTS);
于 2012-05-30T08:18:55.067 回答