簡體   English   中英

std :: vector調整大小算法

[英]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 HelloWorld 現在您有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM