我有std::list
的Bananas
,我想摆脱坏的。有没有相对简单的方法来执行下面的伪代码?C++从列表中删除列表时,迭代列表
foreach(Banana banana in bananaList)
{
if(banana.isBad()) bananaList.remove(banana);
}
(制作从C#和Java和C++的转变一直是颠簸的道路。)
我有std::list
的Bananas
,我想摆脱坏的。有没有相对简单的方法来执行下面的伪代码?C++从列表中删除列表时,迭代列表
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
一个成员函数,比利·奥尼尔的回答可能是更好的方式来做到所描述的工作,尽管这会更容易便利着想rt何时/如果您决定使用vector,deque等等,正如已经在评论中讨论的那样,这可能是一件好事。
+1指向我的答案:P – 2010-07-19 20:44:28
您可以使用自制软件类似的代码
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
可用的,太)。
应该总是喜欢显式循环的算法。 – 2010-07-19 20:44:57
http://stackoverflow.com/questions/1038708/erase-remove-contents-from-the-map-or-any-other-stl-container-while-iterating – YuppieNetworking 2010-07-19 20:31:13
@YuppieNetworking:链接的问题在一般情况下,但没有最好的解决方案的OP的情况下 - 他想删除一个元素,如果一个成员函数返回true。 – 2010-07-19 20:32:35