std::矢量大小在尝试填充后保持为零

std::vector size remains zero after trying to fill it

本文关键字:填充 std      更新时间:2023-10-16

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

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

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);

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

使用reserve时,实际上并不是在向量中创建元素。您的工作分配正在访问不存在的元素。

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

所以不是非法的

Vec[0] = 2.0;

尝试

Vec.push_back( 2.0 );

这将使矢量大小增加1。

顺便说一下,申报单应该是

vector<double> Vec;

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 ... };

这两种方法都具有初始化直接在矢量中输入数据。