[英]C++ removing from list while iterating over list
我有一个std::list
Bananas
std::list
,我想摆脱坏的。 是否有任何相对简单的方法来执行以下伪代码?
foreach(Banana banana in bananaList)
{
if(banana.isBad()) bananaList.remove(banana);
}
(从C#和Java转换到C ++是一条艰难的道路。)
bananaList.remove_if(std::mem_fun_ref(&Banana::isBad));
请注意,你可能应该使用std::vector
而不是std::list
尽管 - 在99.9%的情况下, vector
表现更好,并且它更容易使用。
编辑:如果你使用向量,向量没有remove_if成员函数,所以你必须使用命名空间std
的普通remove_if
:
bananaVector.erase(
std::remove_if(bananaVector.begin(), bananaVector.end(), std::mem_fun_ref(&Banana::isBad)),
bananaVector.end());
你通常会这样做:
list.erase(std::remove_if(list.begin(), list.end(), std::mem_fun(Banana::isBad)), list.end());
编辑:由于remove_if
被实现为std::list
的成员函数,Billy ONeal的回答可能是更好的方式来完成所描述的工作,尽管如果你决定使用vector,deque时这会更容易转换等等,正如评论中已经讨论的那样,这可能是一件好事。
您可以使用自制程序代码
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
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.