从矢量中删除项目

时间:2014-05-24 18:44:54

标签: c++ performance vector

我正在寻找从矢量中删除多个项目的最有效方法吗?

基本上我将在向量中搜索一个标志,并删除具有该标志的对象。

但是,我听说从向量中删除一个对象会弄乱你的迭代器,那么循环通过一个向量(可能包含数千个对象)并删除那些带有特定标志的最有效方法是什么?

我希望不必多次遍历矢量。

2 个答案:

答案 0 :(得分:5)

如果有多个元素与该标志匹配,则应使用std::remove_if()

vec.erase(std::remove_if(vec.begin(), v.end(), [](T const& e){ return e.flag(); }),
          v.end());

使用此方法最多移动每个向量元素一次。删除单个元素可能会移动每个元素O(n)次。

答案 1 :(得分:2)

std::remove_if算法有时可以优雅地与其他实用程序耦合。例如,如果您的课程如下所示:

struct Foo
{
    bool flag;               // either this...
    bool get_flag() const;   // ... or this
    // ...
};

然后你可以使用std::mem_fn生成一个访问器函子,它返回成员的值或分别调用成员函数:

std::mem_fn(&Foo::flag)
std::mem_fn(&Foo::get_flag)

最后,只要其中一个参数类型来自该命名空间,就可以使用依赖于参数的查找来依赖命名空间std。例如:

#include <algorithm>   // for remove_if
#include <functional>  // for mem_fn
#include <iterator>    // for begin, end
#include <vector>      // for vector

std::vector<Foo> v = /* something */ ;

v.erase(remove_if(begin(v), end(v), std::mem_fn(&Foo::flag)), end(v));