我想为每个循环使用新的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循环执行此操作,还是必须返回迭代器才能实现此目的?
答案 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-expr
和end-expr
有自己的冗长定义,但在您的示例中,它们分别是myList.begin()
和myList.end()
。
答案 2 :(得分:0)
不,我不这么认为。见this SO answer:
不,你不能。基于范围的是用于何时需要访问每个 一次容器的元素。如果需要,你应该使用普通for循环或其中一个表兄弟 随着时间的推移修改容器,访问多个元素 一次,或以其他方式通过非线性方式迭代 容器