是否可以为每个循环擦除c ++ 11中std :: list的元素

时间:2013-01-13 15:32:54

标签: c++ stl c++11

我想为每个循环使用新的C ++ 11迭代列表的所有元素并删除某些元素。例如

std::list<int> myList;
myList.push_back(1); 
myList.push_back(13);
myList.push_back(9);
myList.push_back(4);

for(int element : myList) {
    if(element > 5) {
        //Do something with the element

        //erase the element
    }else{
        //Do something else with the element
    }
}

是否可以使用for each循环执行此操作,还是必须返回迭代器才能实现此目的?

3 个答案:

答案 0 :(得分:6)

你应该能够做到这一点

myList.erase(std::remove_if(myList.begin(), myList.end(),
    [](int& element) 
    { 
        return element > 5;
    } 
    ),myList.end());

或者简单地(由Benjamin Lindley提供)

myList.remove_if(
    [](int& element) 
    { 
        return element > 5;
    } 
    );

答案 1 :(得分:5)

您无法在基于范围的for循环中擦除标准容器的元素 - 循环本身具有您当前正在访问的元素的迭代器,并且擦除它将使循环之前的迭代器无效增加它。

基于范围的for在标准的6.5.4中定义为等同于(略微简化):

for (auto __begin=begin-expr, __end=end-expr; __begin != __end; ++__begin) {
    for-range-declaration = *__begin;
    statement
}

begin-exprend-expr有自己的冗长定义,但在您的示例中,它们分别是myList.begin()myList.end()

答案 2 :(得分:0)

不,我不这么认为。见this SO answer:

  不,你不能。基于范围的是用于何时需要访问每个   一次容器的元素。

     

如果需要,你应该使用普通for循环或其中一个表兄弟   随着时间的推移修改容器,访问多个元素   一次,或以其他方式通过非线性方式迭代   容器