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



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

 class my_class{
       float a; int b;
 };
 my_class obj;
 vector<my_class> vec;

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

 vec
 ((10.0,2),(100,3),(19.0,3)...)

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

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function(vec, (vec.end()-1).a, (vec.end()-1).b)), vec.end());

我所拥有的predicate_function在"vec"上进行迭代。然而,这违背了使用std::remove_if的目的。有人可以帮助什么谓词函数应该看起来像为了remove_if工作。我不想用lambda_function。我的编译器是GCC

谓词函数将自动从每个Iterator传递参数。所以它看起来像这样:

bool predicate_function(const my_class& m)
{
    //Some logic here
}

可以简单地称为:

vec.erase(std::remove_if(vec.begin(), vec.end(), predicate_function), vec.end());

在c++中,std::remove_if需要一个UnaryPredicate作为它的第三个形参,它可以是一个函数或函子,接受一个实参并返回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());

最新更新