5

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

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

这段代码有什么问题?

4

2 回答 2

9

仅当您在该迭代中不删除任何元素时,才应递增迭代器:

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());
于 2012-12-10T15:38:48.587 回答
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;
    }
} 
于 2012-12-10T15:39:50.270 回答