我想知道是否有一种基于某些外部值对矢量进行排序的好方法。例如,我有一个k的最近邻点的向量。我想根据它们到查询点的距离对这个向量进行排序。查询点不包含在结果中,std :: sort允许您为向量中的两个元素定义比较函数(而不是每个元素与固定点)。是否有任何预先构建的方法来进行此类排序?或者我需要构建自己的自定义排序算法?感谢
答案 0 :(得分:6)
如果您有一些课程Point
,并且要排序的点是
Point p
还假设points
被定义为
std::vector<Point> points;
你有一些函数dist
花了2 Point
并返回距离(例如欧几里德距离),如
double dist(const Point& lhs, const Point& rhs)
{
// compute Euclidean distance or whatever
}
然后你可以使用std::sort
和lambda函数
std::sort(begin(points),
end(points),
[p](const Point& lhs, const Point& rhs){ return dist(p, lhs) < dist(p, rhs); });
修改强>
如果您没有C ++ 11访问权限,则需要定义一个仿函数
struct DistanceFunc
{
DistanceFunc(const Point& _p) : p(_p) {}
bool operator()(const Point& lhs, const Point& rhs) const
{
return dist(p, lhs) < dist(p, rhs);
}
private:
Point p;
};
然后你可以用类似的方式排序
std::sort(points.begin(), points.end(), DistanceFunc(p));
答案 1 :(得分:1)
您不需要不同的排序算法。 std::sort
与用户提供的订单完美配合。
这里唯一的问题似乎是你的定义。它仍然很简单,使用lambda:[X] (Point A, Point B) { return distance(A,X) < distance(B,X); }
答案 2 :(得分:0)
你可以使用你正在谈论的方法,使用矢量中的两个点(包括矢量中的外部点),然后确保在完成时使用pop_front / erase。
答案 3 :(得分:0)
使用函数对象:
struct closer : public binary_function<point, point, bool>
{
closer(point np):p(np)
{}
point p;
bool operator()(point x, point y) { return dist(x,p) < dist(y,p); }
};
sort(V.begin(), V.end(), closer(P));