C++ - 如何正确地将比较器传递给 STL 函数

标签 c++ c++11 stl

我写了一个 PointCollection 类。

PointCollection 包含一堆点。

它有2个成员函数。

addPoint(点点)

findNearestKPoints(Point center, int k)

每次调用 findNearestKPoints 时,都会指定一个 center 以找到它周围的 k 个最近点。

但是编译不了:

错误:调用的对象类型 'bool (PointCollection::*)(const Point &, const Point &) const' 不是函数或函数指针

如何正确操作?

我的代码如下作为引用:

struct Point {
    int val_;
    Point() {}
    Point(int val) : val_(val) {}
};

class PointCollection {
private:
    vector<Point> points_;
    Point center_;
public:
    PointCollection() {}
    virtual ~PointCollection() {}

    void addPoint(const Point &point) {
        points_.push_back(point);
    }

    bool compare(const Point &a, const Point &b) const {
        return std::abs(a.val_ - center_.val_) < std::abs(b.val_ - center_.val_);
    }

    vector<Point> findNearestKPoints(Point center, int k) {
        center_ = center;

        nth_element(points_.begin(), points_.begin() + k - 1, points_.end(), 
                    &PointCollection::compare);

        return vector<Point>(points_.begin(), points_.begin() + k);
    }
};

最佳答案

比较器是一个可调用对象。换句话说:函数指针或 lambda 闭包,或具有合适 operator() 的类.

&PointCollection::compare不是可调用对象。这是一个类方法。它不是可调用对象,原因很简单,您不能直接调用它。类方法只能在类的实例 上调用。你必须在某个地方有这个类的一个实例,你称之为 compare()方法。它看起来像一个函数,但实际上不是。这是一个类方法。

一个简单的解决方案是捕获 this通过 lambda,类似于 (C++14):

nth_element(points_.begin(), points_.begin() + k - 1, points_.end(),
              [this](const auto &a, const auto &b)
                  {
                      return this->compare(a, b);
                  });

lambda 捕获 this , 和 compare()可以在 this 上调用,就像它可以直接从父方法中调用一样。

附言你的findNearestKPoints()正在返回 vector<Point> ,而不是 vector<int> ,正如您声明的那样。

关于C++ - 如何正确地将比较器传递给 STL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129973/

相关文章:

c++ - 从作为模板参数传递的 const 类型继承

c++ - 为什么我们不能通过索引访问元组的元素?

c++ - 函数模板编译错误

c++ - 默认相等运算符是否有任何 C++20 功能测试?

c++ - 远程机器上的 OpenGL (v >=3) 应用程序

algorithm - 在没有循环的情况下向向量的所有条目添加一个值

除非包装在 std::ref 中,否则 C++11 lambda 通过复制捕获

c++ - OpenGL 围绕相机移动场景

c++ - 如何测试 libstdc++ 版本

c++ - 如果 x > y,则交换 x 和 y 的无分支版本?