首页 文章

使用swap-and-pop [关闭]迭代时在向量中擦除元素

提问于
浏览
4

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

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 回答

  • 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;
        }
    }
    
  • 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());
    

相关问题