[英]std::vector resize algorithm
我實際上是在嘗試實現std :: vector的簡單副本。 在測試期間,通過與原始數據進行比較來查看我的數據是否一致,我注意到了一些東西。
std::vector<std::string> *v = new std::vector<std::string>(2);
std::string str1("Hello");
std::string str2("World");
v->push_back(str1);
v->push_back(str2);
v->resize(5);
for (std::vector<std::string>::const_iterator it = v->begin(); it != v->end(); it++)
{
std::cout << "/" << (*it) << "/" << std::endl;
}
結果如下:
//
//
/Hello/
/World/
//
有人可以解釋一下為什么調整大小后不附加std :: string()的原因:
/Hello/
/World/
//
//
//
背后的算法是什么?
關鍵在這里:
std::vector<std::string> *v = new std::vector<std::string>(2);
這將創建一個包含2個元素的向量,這些元素是默認構造的(意味着-兩個空字符串)。 然后您將push_back
Hello
和World
。 現在您有4個元素。 然后, resize( 5 )
僅添加一個元素(也是默認構造的)。
我想您想操縱/增加容量? 您需要改為std::vector::reserve
。
您應該創建一個空向量,然后使用push_back
看到預期的行為。 或者只使用operator[]
而不是兩個push_back
。
是否有充分的理由在堆上而不是在堆棧上創建向量? 您(幾乎?)總是應該避免這種情況。
您正在構建一個std :: vector,其中包含2個項目,默認構造。
參考: std :: vector構造函數
更換:
std::vector<std::string> *v = new std::vector<std::string>(2);
與:
std::vector<std::string> *v = new std::vector<std::string>();
而且,順便說一句,為什么要用new在堆上分配向量? 只需聲明為:
std::vector<std::string> v;
在向量的構造中,您傳遞了2
作為參數。 如果您查看該構造,您將看到以下內容:
explicit vector(size_type _Count)
在這里,您將創建一個帶有兩個默認構造字符串的向量,然后將另外兩個字符串推入向量。 使用默認構造,然后使用std::vector::reserve
增加vector的容量。
要獲得想要的結果,請嘗試以下操作:
std::vector<std::string> *v = new std::vector<std::string>({"s1","s2"});
然后進行大小調整和循環。 如您所建議的那樣,這應該為您提供預期的填充。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.