我寫了一個PointCollection
類。如何通過一個比較器正確的STL功能
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);
}
};
你寫的'比較'函數需要一個工作實例,它不需要查看該函數的內容。使其成爲'靜態',或使其成爲非會員'朋友'功能。 – Chad
@Chad:該函數使用成員'center_',所以它是必要的。 –
@BenjaminLindley呃---是的。這讓我覺得這只是_wrong_。二進制比較函數幾乎總是比較傳入的對象,並且不會嘗試進行第三次比較......我不太瞭解這個特定問題域是否可以說出是否錯誤。 – Chad