我在这里使用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时,它运行正常。
为什么在使用向量时会出现断言失败?
答案 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()
未被缓存