迭代列表时C ++从列表中删除

时间:2010-07-19 20:27:50

标签: c++ list

我有一个std::list Bananas,我想摆脱那些不好的。有没有相对简单的方法来执行以下伪代码?

foreach(Banana banana in bananaList)
{
    if(banana.isBad()) bananaList.remove(banana);
}

(从C#和Java转换到C ++是一条艰难的道路。)

3 个答案:

答案 0 :(得分:7)

bananaList.remove_if(std::mem_fun_ref(&Banana::isBad));

请注意,您可能应该使用std::vector代替std::list,但{99}的案例中vector表现更好,而且更容易使用。

编辑:如果您使用向量,向量没有remove_if成员函数,因此您必须使用名称空间remove_if中的纯std

bananaVector.erase(
    std::remove_if(bananaVector.begin(), bananaVector.end(), std::mem_fun_ref(&Banana::isBad)), 
    bananaVector.end());

答案 1 :(得分:1)

您通常会执行以下操作:

list.erase(std::remove_if(list.begin(), list.end(), std::mem_fun(Banana::isBad)), list.end());

编辑:感谢remove_if被实现为std::list的成员函数,Billy ONeal的回答可能是更好的方式来完成所描述的工作,尽管这会更容易转换为/ if你决定使用vector,deque等,正如评论中已经讨论的那样,这可能是一件好事。

答案 2 :(得分:0)

您可以使用自制代码,例如

for(list<...>::iterator it=bananas.begin(); end=bananas.end(); it!=end;) {
  if(... decide ...) {
    it=bananas.erase(it);
  } else
    ++it;
}

或者,您可以使用list::remove_if方法或std::remove_if函数(也可以使用vector)。