4

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

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

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

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

现在,我打算从向量 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

4

1 回答 1

5

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

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期望 aUnaryPredicate作为其第三个参数,它是接受 1 个参数并返回的函数或仿函数bool

编辑:要在评论中做你想做的事,你需要使用 a 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());
于 2013-04-11T02:36:27.510 回答