我写了一个 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/