9

I want to use the new C++11 for each loop to iterate over all elements of a list and erase certains elements. For example

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

Is it possible to do this using the for each loop or do I have to go back to iterators to achive this?

4

3 回答 3

6

你应该能够做到这一点

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

或者简单地说(由本杰明林德利提供)

myList.remove_if(
    [](int& element) 
    { 
        return element > 5;
    } 
    );
于 2013-01-13T15:39:33.627 回答
5

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

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

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

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

于 2013-01-13T16:04:02.420 回答
0

不,我不这么认为。看到这个答案:

不,你不能。基于范围的 for 用于需要访问容器的每个元素一次的情况。

如果您需要在进行过程中修改容器、多次访问元素或以非线性方式遍历容器,则应该使用普通的 for 循环或其表亲之一。

于 2013-01-13T15:40:21.170 回答