Joh*_*itb 21
我更喜欢remove_if
v.erase(remove_if(v.begin(), v.end(),
mem_fun_ref(&MyClass::isTiredOfLife)),
v.end());
Run Code Online (Sandbox Code Playgroud)
remove_if
返回一个迭代器,指向仍在序列中的最后一个元素.erase
擦除从第一个参数到最后一个参数(两个迭代器)的所有内容.
使用remove_if是执行此操作的"正确"方法.注意不要使用迭代器来循环和擦除,因为删除项会使迭代器无效.事实上,任何使用erase()作为主要方法的例子对矢量都是一个坏主意,因为擦除是O(n),这将使你的算法成为O(n ^ 2).这应该是O(n)算法.
我给出的方法可能比remove_if快,但与remove_if不同,它不会保留元素的相对顺序.如果您关心维护顺序(即您的矢量已排序),请使用remove_if,如上面的答案所示.如果您不关心订单,并且要删除的项目数通常少于矢量的四分之一,则此方法可能会更快:
for( size_t i = 0; i < vec.size(); )
if( vec[i].isTiredOfLife() )
{
vec[i] = vec.back();
vec.pop_back();
}
else
++i;
Run Code Online (Sandbox Code Playgroud)