尝试填充后,std :: vector size保持为零

时间:2013-02-06 19:03:44

标签: c++ vector

我正在努力有效地使用矢量。所以我先保留内存,然后使用向量。但是在我尝试使用[]运算符填充向量后,向量的大小保持为零。为什么会这样?

vector Vec; 
Vec.reserve(10); 
Vec[0] = 2.0; 
Vec[1] = 3.0;
...

5 个答案:

答案 0 :(得分:11)

reserve()仅保留后备存储中的空间,因此后续推送的元素不必重新分配(直到超出保留空间)。它不会更改向量的实际大小,因此您的Vec[0] =访问实际上是在向量的末尾运行。

您可以使用

vector Vec;
Vec.resize(10);
Vec[0] = 2.0;
Vec[1] = 3.0;

如果你愿意,大小将是10.或者如果你希望此时的大小只有2,但仍然保留空间以避免多次重新分配,你可以使用

vector Vec;
Vec.reserve(10);
Vec.push_back(2.0);
Vec.push_back(3.0);

答案 1 :(得分:3)

reserve()不会调整矢量大小。您需要使用resize()

答案 2 :(得分:2)

使用reserve时,实际上并没有在向量中创建元素。您的作业正在访问不存在的元素。

答案 3 :(得分:2)

std :: vector不会自动展开。功能保留(大小)不会增加大小,它只能确保您有足够的内存用于以后的大小扩展。

所以不是非法的

Vec[0] = 2.0;

尝试

Vec.push_back( 2.0 );

这会将矢量大小增加1。

顺便说一句,声明应该是

vector<double> Vec;

答案 4 :(得分:1)

reserve对矢量的大小没有影响。最多的 我使用过的实现,以下访问会有 导致程序终止。如果没有,你可能 用错误的选项编译。

您应该直接构造大小为10的向量:

std::vector<double> vec( 10 );

如果要插入的值是常量,则可以这样做 类似的东西:

static double initVec[] = { 2.0, 3.0 ... };
std::vector<double> vec( begin( initVec ), end( initVec ) );

,或者如果您使用的是C ++ 11:

std::vector<double> vec{ 2.0, 3.0 ... };

这两种方法都具有初始化的优点 矢量中的数据直接。