我正在寻找从矢量中删除多个项目的最有效方法吗?
基本上我将在向量中搜索一个标志,并删除具有该标志的对象。
但是,我听说从向量中删除一个对象会弄乱你的迭代器,那么循环通过一个向量(可能包含数千个对象)并删除那些带有特定标志的最有效方法是什么?
我希望不必多次遍历矢量。
答案 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));