c ++向量不像数组

ban*_*ong 7 c++

我已经开始使用c ++几个月了,并且已经被谷歌指导到堆栈溢出大部分时间用于c ++查询.我经常注意到"你为什么不使用矢量"这一类型的劝诫,并且受到了启发,只是为了做到这一点.

因此,主要是为了获得自动内存释放的微小优势,并能够编写用于排序的类型化比较函数.我将一个指向对象的数组切换为一个向量.现在我想(似乎不正确)矢量可以或多或少地像数组一样使用,因此我初步化了:

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

没有来自编译器的投诉.然后一段时间后我需要在集群对象的某个属性上对向量进行排序.所以:

std::sort(pclust.begin(), pclust.end(), ClusterCompareNumSegs);
Run Code Online (Sandbox Code Playgroud)

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

pclust.push_back(clusters + i);
Run Code Online (Sandbox Code Playgroud)

现在这很容易解决,但我很困惑,因为最初的错误分配工作正常.我成功迭代了向量 - 使用数组语法,如下所示:

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

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

Ben*_*ier 11

vector::reserve不会更改矢量的大小,它仍然只包含0它创建的元素.它的作用是确保向量可以保留numClust而不必重新分配.看到这里.

你想要的是声明矢量具有那个大小

vector<cluster *> pclust(numClust);
Run Code Online (Sandbox Code Playgroud)

或者调整矢量大小

pclust.resize(numClust);
Run Code Online (Sandbox Code Playgroud)


Lih*_*ihO 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()和数组索引更快,为什么?:)