2015-07-19 139 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