2015-07-19 72 views
2

我有我的向量與類型的一些值Texture_Map這只是一個intC++ - 向量迭代器不可增量錯誤

我沒有擦除任何東西......我只是想在每個偶數迭代中插入一個值。

喜歡的東西: 如果我有這樣的載體[1,2,3,4,5]

而且我Texture_Map::TEXTURE_FLIP99,那麼我最終的載體應該是:

[99,1,99,2,99,3,99,4,99,5] 

第一insert()後,我得到了「矢量迭代器不增量問題「錯誤。

代碼:

myVector.push_back(Texture_Map::TEXTURE_INIT); 

for(unsigned int i = 0 ; i < m_max_pieces-2; i++) 
    myVector.push_back((Texture_Map::TextureID)i); 

std::random_shuffle(myVector.begin(), myVector.end()); 

std::vector<Texture_Map::TextureID>::iterator it = myVector.begin(); 

for (it=myVector.begin(); it<myVector.end(); it++) 
{ 
    myVector.insert(it,Texture_Map::TEXTURE_FLIP); 
} 

謝謝!

回答

4

作爲在載體上使用insert的結果的部分是,它:

導致重新分配,如果新的大小()比舊的容量更大()。如果新大小()大於容量(),則所有迭代器和引用都將失效。否則,只有插入點之前的迭代器和引用保持有效。過去最終迭代器也失效。

您正在看到的問題是,您正試圖增加一個不再有效的迭代器 - 它已經過了插入點,因此它失效了。這裏的解決方案是採取這一事實優點insert返回iterator

iterator insert(iterator pos, const T& value); 

具體來說:

返回值
1-2)迭代器指向插入的值

所以你想:

for (it=myVector.begin(); it<myVector.end(); it++) { 
    // now it will point to TEXTURE_FLIP 
    it = myVector.insert(it,Texture_Map::TEXTURE_FLIP); 

    // now it will point back to the original element 
    ++it; 
} 
+0

您能否指出標準明確指出插入點處和之後的迭代器變爲無效的位置? – AlexD

+0

@AlexD它只需要插入點前的那些保持有效,它並沒有聲明它們變得無效。然而,它並不要求它們保持有效 - 假設它們不是那麼好。 – Barry

+0

毫無疑問,假設所有迭代器都是無效的更安全。我的意思是說,cppreference的引用不是100%準確地表示_「否則,只有插入點之前的迭代器和引用保持有效,過去的末端迭代器也會失效。 – AlexD