2013-02-06 48 views
2

我试图高效地使用向量。所以我先保留内存然后使用这个向量。但在我尝试使用[]运算符填充矢量后,矢量的大小保持为零。为什么会发生?std ::向量大小在尝试填充后仍为零

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

您正在调整保留和调整大小。 –

+0

为什么要混合?我不想初始化 – Hesam

+1

调整大小,为什么不直接插入矢量? – WeaselFox

回答

10

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

reserve()不调整向量。您需要使用resize()

2

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

2

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

所以不是非法

Vec[0] = 2.0; 

尝试

Vec.push_back(2.0); 

这将通过1

增加矢量大小顺便说一句,该声明应该是

vector<double> Vec; 
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 ... }; 

这两种方法都具有i将矢量中的数据直接进行氮化。