在std :: remove_if中使用谓词函数

时间:2013-04-11 02:31:26

标签: c++

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

 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的目的。有人可以帮助确定predicate_function应该是什么样子,以便remove_if工作。我不想使用lambda_function。我的编译器也是GCC

1 个答案:

答案 0 :(得分:3)

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

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作为其第三个参数,即函数或函子接受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());