c ++根据与外部Point的距离对Vector进行排序

时间:2015-09-17 15:25:45

标签: c++ sorting

我想知道是否有一种基于某些外部值对矢量进行排序的好方法。例如,我有一个k的最近邻点的向量。我想根据它们到查询点的距离对这个向量进行排序。查询点不包含在结果中,std :: sort允许您为向量中的两个元素定义比较函数(而不是每个元素与固定点)。是否有任何预先构建的方法来进行此类排序?或者我需要构建自己的自定义排序算法?感谢

4 个答案:

答案 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));