c++ - std::remove_if 中谓词函数的使用

标签 c++

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

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

vector 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

最佳答案

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

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,但我们将使用 functor路线在这里):

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());

关于c++ - std::remove_if 中谓词函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939721/

相关文章:

c++ - 为什么这个用两个参数声明的构造函数可以只用一个参数调用?

c++ - 有没有办法从 map 中获取特定的键值对?

c++ - 静态库中的隐藏符号

c++ - 每个类仅在 Gtest 中调用一次代码

来自基类的c++构造函数

c++ - C++ 中的内存映射流数据

python - 类型错误 : No to_python (by-value) converter found for C++ type

c++ - 如何使用 camshift 算法获得矩形?

c++ - 在 C++11 中使用严格别名时,它是否定义为_write_ 到 char*,然后从别名 nonchar* _read_?

c++ - 线程接收空字符串