我试图高效地使用向量。所以我先保留内存然后使用这个向量。但在我尝试使用[]运算符填充矢量后,矢量的大小保持为零。为什么会发生?std ::向量大小在尝试填充后仍为零
vector Vec;
Vec.reserve(10);
Vec[0] = 2.0;
Vec[1] = 3.0;
...
我试图高效地使用向量。所以我先保留内存然后使用这个向量。但在我尝试使用[]运算符填充矢量后,矢量的大小保持为零。为什么会发生?std ::向量大小在尝试填充后仍为零
vector Vec;
Vec.reserve(10);
Vec[0] = 2.0;
Vec[1] = 3.0;
...
reserve()
只在后备存储中保留空间,以便后续的推送元素不必产生重新分配(直到您超出保留空间为止)。它不会更改矢量的实际大小,因此您的访问实际上是在矢量的末尾运行。
你可以使用
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 ... };
这两种方法都具有i将矢量中的数据直接进行氮化。
您正在调整保留和调整大小。 –
为什么要混合?我不想初始化 – Hesam
调整大小,为什么不直接插入矢量? – WeaselFox