尽管索引容量不足,但vector.at()仍会出现扼流圈

时间:2013-06-05 03:03:35

标签: c++ std stdvector

我正在使用Debian 7.0.0下的CodeBlocks 10.05开发一个C ++应用程序。

因此我将空间分配给矢量。

std::vector<double> dpMeanUnnormalizedRef;
dpMeanUnnormalizedRef.reserve(expectedUpperLimit);

然后我尝试添加一个值。不幸的是,我需要添加值的索引不是顺序的,所以我不能使用push。我第一次尝试添加元素时,调用如下。

dpMeanUnnormalizedRef.at(index)=doubleVar;

此时,大小为0,容量为621,而索引的值为0.然而,此调用会导致程序超出范围异常。

2 个答案:

答案 0 :(得分:6)

reserve只需保留项目的物理空间,而无需将它们实际添加到矢量中。当您知道向量将提前有多大时,它旨在通过减少重新分配的数量来提高效率。您需要使用resize

答案 1 :(得分:2)

正如马克所说,reserve仅帮助vector管理其内存,实际上并未添加元素,您可以使用assign

而不是

dpMeanUnnormalizedRef.reserve(expectedUpperLimit);

使用

dpMeanUnnormalizedRef.assign(expectedUpperLimit,0.0);

您也可以使用resize或构造函数本身。