使用swap-and-pop迭代时,在向量中擦除元素

时间:2012-12-10 15:34:08

标签: c++ vector

我想在迭代向量时擦除某些元素,但是下面的代码导致“向量迭代器不可递增”断言失败。

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
    } 
} 

此代码有什么问题?

2 个答案:

答案 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());