std::remove_if 中谓词函数的用法

Jan*_*ora 4 c++

我有一个对象向量。我的数据结构如下:

 class my_class{
       float a; int b;
 };
 my_class obj;
 vector<my_class> vec;
Run Code Online (Sandbox Code Playgroud)

向量 vec 包含以下形式的数据:

 vec
 ((10.0,2),(100,3),(19.0,3)...)
Run Code Online (Sandbox Code Playgroud)

现在,我打算从向量 vec 中删除小于或等于 vec 最后一个元素的元素...为此,我使用擦除和remove_if函数:

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function(vec, (vec.end()-1).a, (vec.end()-1).b)), vec.end());
Run Code Online (Sandbox Code Playgroud)

我拥有的 predicate_function 对“vec”进行迭代。然而,这违背了使用 std::remove_if 的目的。有人可以帮助了解 predicate_function 应该是什么样子才能使remove_if 起作用吗?我不想使用 lambda_function。另外我的编译器是GCC

Yuu*_*shi 5

谓词函数将自动传递来自每个迭代器的参数。所以它看起来像这样:

bool predicate_function(const my_class& m)
{
    //Some logic here
}
Run Code Online (Sandbox Code Playgroud)

那么这将被简单地称为:

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function), vec.end());
Run Code Online (Sandbox Code Playgroud)

在 C++ 术语中,std::remove_if期望 aUnaryPredicate作为其第三个参数,它是接受 1 个参数并返回 的函数或函子bool

编辑:要在评论中执行您想要的操作,您需要使用functor(或std::bind,但我们将在此处使用函子路线):

struct compare_last
{
    const my_class last_;

    compare_last(const my_class& last)
      : last_(last)
    { }

    bool operator()(const my_class& m) const
    {
        return m == last_; //Or however you do your comparisons
    }
};

my_class& last = *(--vec.end());
vec.erase(std::remove_if(vec.begin(), vec.end(), compare_last(last)), vec.end());
Run Code Online (Sandbox Code Playgroud)