在Visual Studio 2013中,我創建了一個std :: vector並在其中存儲了一些字符串。然後,我想在vector中創建一些字符串的副本,並將它們追加到最後(假設在insert將擦除後將它們移動到最後),但是使用insert方法,我只在末尾看到空字符串,非常奇怪。我用一些簡單的測試代碼重現它,std :: vector <std::string>插入空字符串代替
std::vector<std::string> v;
std::string s = "0";
for (int i = 0; i < 7; ++i)
{
s[0] = '0' + i;
v.push_back(s);
}
v.insert(v.end(), v.begin(), v.begin() + 3);
for (std::string& s : v)
std::cout << "\"" << s.c_str() << "\" ";
我得到什麼有 「0」 「1」 「2」 「3」 「4」 「5」 「6」 「」 「」 「」
我調試成insert方法,在vector類的_Insert(..)方法裏面,它做了一些內存重新分配,內存移動/移動等等。
第一個_Umove調用將所有7個字符串移動到新分配的內存,我認爲std :: move被調用,舊的內存剩下一些空的字符串。
然後_Ucopy方法嘗試複製3個項目,但從舊的內存中,因此附加3空字符串。 還有一個_Umove呼叫,我不確定那是什麼。在所有這些之後,舊的內存被釋放並且新的內存被附加到該載體上。
使用像int這樣的標量類型不會產生錯誤的輸出,因爲內存被複制,所以不會調用std :: move。
我在這裏做錯了什麼,或者它是MS Visual Studio的STL錯誤?
據我所知,重新分配會導致迭代器和引用無效,這應該在插入返回後發生。任何迭代器和對矢量的引用都是無效的,但是這在調用期間發生,這對我來說很奇怪。我嘗試在插入之前預留一些空間,然後工作。這只是一個解決方法。稍後我會嘗試使用其他編譯器。 –
@TigerHwang您將兩個迭代器傳遞給'insert'函數。只要'insert'函數爲新元素留出空間,那些通過的迭代器就會失效。使用其他編譯器不能解決您的問題。預留空間是唯一的解決方案。 –
我的對象是將向量中的一些字符串移動到最後,所以我嘗試了另一種方法std :: move(v.begin(),v.begin()+ 3,v.end())。這會導致由於迭代器+偏移量超出範圍而導致斷言失敗。使用std :: move(v.begin(),v.begin()+ 3,v.end() - 3),它不會失敗,但結果不是我想要的。任何建議? –