我有一个std::list
的Bananas
,我想把坏的都除掉。是否有相对简单的方法来执行以下伪代码?
foreach(Banana banana in bananaList)
{
if(banana.isBad()) bananaList.remove(banana);
}
从C#和Java转向C++一直是一条崎岖的道路。
我有一个std::list
的Bananas
,我想把坏的都除掉。是否有相对简单的方法来执行以下伪代码?
foreach(Banana banana in bananaList)
{
if(banana.isBad()) bananaList.remove(banana);
}
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());
std :: list
是最好的选择。 - JnBrymnstd::list
使得删除本身很快(O(1)),但是找到正确的位置相对较慢(O(N),通常比向量更高的常数)。 - Jerry Coffinstd::vector
通常比理论上的std::list
表现更好。你需要进行测量。 - sbistd::remove_if
,您是正确的。但是对于std::list<t>::remove_if
,成员函数会为您处理这个问题。 - Billy ONeal通常情况下,您会做这样的事情:
list.erase(std::remove_if(list.begin(), list.end(), std::mem_fun(Banana::isBad)), list.end());
remove_if
被实现为std::list
的成员函数,Billy ONeal的答案可能是更好的方法来完成所描述的工作,尽管当/如果您决定使用向量、双端队列等时,这将更容易转换,正如已经在评论中讨论的那样,这可能是一个好主意。你可以使用自制代码,例如
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
中也可用)。