【问题标题】:c++ Sort Vector based on distance to external Pointc ++根据到外部点的距离对向量进行排序
【发布时间】:2015-09-17 15:25:44
【问题描述】:

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

【问题讨论】:

  • 直接的解决方案是使用带有std::sort 的自定义比较函数对象(如下面的答案所示)。但这可能会变得非常浪费,因为它会(可能)多次计算相同的距离。如果这对您来说是个问题,您可能需要预先计算距离,或者对计算的距离进行某种形式的缓存。

标签: c++ sorting


【解决方案1】:

如果你有一些课程 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));

【讨论】:

  • 有没有你能想到的不用 Lambdas 的方法?我仅限于使用尚未完全支持 c++11 的编译器。
  • @armstrhu:你可以创建一个函数对象来做与 lambda 相同的事情。
  • 但是我将无法捕获查询点并仍然匹配参数模板对吗?
  • 您可以通过将p 作为构造函数参数传递给函数对象来捕获点。不确定“匹配参数模板”是什么意思。
  • 我想我的意思是排序将调用 f(Point lhs,Point rhs),所以添加查询点不会匹配。构造带有查询点的对象应该这样做。谢谢!
【解决方案2】:

您不需要不同的排序算法。 std::sort 非常适合用户提供的订单。

这里唯一的问题似乎是您的定义。仍然很容易,使用 lambda:[X] (Point A, Point B) { return distance(A,X) &lt; distance(B,X); }

【讨论】:

    【解决方案3】:

    您可以只使用您正在谈论的方法与向量中的两个点(包括向量内的外部点),然后确保在完成后 pop_front/erase。

    【讨论】:

      【解决方案4】:

      使用函数对象:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-05
        • 2021-05-14
        • 1970-01-01
        • 2019-02-21
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 2020-02-13
        相关资源
        最近更新 更多