2013-02-06 50 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將矢量中的數據直接進行氮化。