我試圖高效地使用向量。所以我先保留內存然後使用這個向量。但在我嘗試使用[]運算符填充矢量後,矢量的大小保持爲零。爲什麼會發生?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