我想在迭代向量时擦除某些元素,但是下面的代码导致“向量迭代器不可递增”断言失败。
for(auto iter=vec.begin(); iter!=vec.end(); ++iter)
{
if((*iter).isDead())
{
std::swap(*iter, vec.back());//swap with the back
vec.pop_back(); //erase the element
}
}
此代码有什么问题?
答案 0 :(得分:7)
您正在通过与当前元素交换的元素递增;如果那是最后一个元素,那么你刚刚删除它并使你的迭代器失效。如果你没有删除,你只想增加使用类似的东西:
for(auto iter=vec.begin(); iter!=vec.end();)
{
if((*iter).isDead())
{
std::swap(*iter, vec.back());//swap with the back
vec.pop_back(); //erase the element
} else {
++iter;
}
}
答案 1 :(得分:6)
只有在不删除迭代中的任何元素时才应增加迭代器:
for(auto iter=vec.begin(); iter!=vec.end();)
{
if((*iter).isDead())
{
std::swap(*iter, vec.back());//swap with the back
vec.pop_back(); //erase the element
}
else
++iter;
}
甚至更好,用remove_if
替换整个循环:
vec.erase(std::remove_if(vec.begin(), vec.end(),
std::bind(&ValueType::isDead, _1)), vec.end());