C ++ - 矢量迭代器不可递增的错误

时间:2015-07-19 22:29:16

标签: c++ vector iterator

我的myVector包含一些 Texture_Map 类型的值,它只是int

我没有删除任何内容......我只是想在每个偶数迭代中插入一个值。

像: 如果我有这个向量[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);
}

谢谢!

1 个答案:

答案 0 :(得分:4)

作为向量使用insert的结果的一部分是它:

  

如果新size()大于旧容量(),则会导致重新分配。如果new size()大于capacity(),则所有迭代器和引用都将失效。否则,只有插入点之前的迭代器和引用仍然有效。过去的迭代器也无效。

您遇到的问题是您尝试增加不再有效的迭代器 - 它已超过插入点,因此无效。这里的解决方案是利用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;
}