我写了一个PointCollection类。
PointCollection持有很多观点。

它具有2个成员函数。
addPoint(Point point)findNearestKPoints(Point center, int k)
每次调用findNearestKPoints时,都会指定一个center来查找其附近的k个最近的点。

但是它不能编译:
error: called object type 'bool (PointCollection::*)(const Point &, const Point &) const' is not a function or function pointer
如何正确做?

我的代码在下面作为引用:

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()方法。它看起来像一个函数,但实际上不是。这是一个类方法。

一种简单的解决方案是通过lambda捕获this,类似于(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上调用,就像可以直接从父方法中调用它一样。

P.S.您的findNearestKPoints()返回的是vector<Point>,而不是您声明的vector<int>

10-04 17:26