“矢量迭代器不兼容”在使用swap-and-pop迭代时向量中擦除元素时断言失败

时间:2012-12-16 01:52:04

标签: c++ vector

我在这里使用swap-and-pop技术:Erasing element in a vector while iterating using swap-and-pop

以下代码导致“矢量迭代器不兼容”断言失败。

for(auto iter=vec.begin(); iter!=vec.end();)
{
    if((*iter).isAlive())//update the entity if the entity is alive
    {
        (*iter).update();
        ++iter;
    }
    else  //otherwise, get rid of it
    {
        std::swap(*iter, vec.back());
        vec.pop_back();
    }
}

但是,当我使用std :: list而不是std :: vector时,它运行正常。

为什么在使用向量时会出现断言失败?

1 个答案:

答案 0 :(得分:0)

当您在最后一个元素上调用vec.pop_back()时,iter无效,因为它指向vec.back()。 STL文档说vector::pop_back()使back()end()无效。

解决此问题的一种方法是检测size()==1的特殊情况:

for(auto iter=vec.begin(); iter!=vec.end(); )
{
    if((*iter).isAlive())//update the entity if the entity is alive
    {
        (*iter).update();
        ++iter;
    }
    else if(vec.size() > 1) // can swap&pop
    {
        std::swap(*iter, vec.back());
        vec.pop_back();
    }
    else // need to reset iterator
    {
        vec.pop_back();
        iter = vec.begin();
    }
}

假设:

  • auto推断出正确的类型
  • 循环不变iter!=vec.end()未被缓存