【问题标题】:How to sort the segments c++如何对段进行排序c ++
【发布时间】:2017-04-24 03:15:30
【问题描述】:

我有边缘向量。我需要通过垂直线 x==(a+b)/2 和这些边缘的交叉点的 y 坐标对这些边缘进行排序。问题是 a 和 b 不是恒定的,它们必须从一个边数组变为另一个边。如何将 a 和 b 参数发送到比较器?

struct vertex
{

   double x,y;

    bool operator==(const vertex &o)const {
        return x == o.x && y == o.y;
    }

    bool operator<(const vertex &o) const{
        return x < o.x || (x == o.x && y < o.y);
    }

};
typedef vector<vertex> vertList;
typedef vector <pair<vertex,vertex>> Edge;

【问题讨论】:

  • 边缘是指没有起点和终点的线吗?不然怎么知道边和竖线x==(a+b)/2有交点?
  • 我的意思是 >。 pair 的第一个元素是起点,第二个元素是终点。所有边都有交叉点。我只需要计算 y 坐标并按它们对边缘进行排序。
  • 我认为你可以制作一个捕获 a 和 b 的 lambda 函数
  • a 和 b 参数是指 o.x 和 o.y 吗?对吗?
  • 我需要找到 1 条垂直线(x=(a+b)/2) 和线段的交点,它表示为一对

标签: c++ algorithm sorting c++11


【解决方案1】:

您可以定义一个比较器类,将ab 作为构造函数参数:

struct EdgeComparator {
    int a;
    int b;

    EdgeComparator(int a, int b): a(a), b(b) {}

    bool operator<(const Edge& lhs, const Edge& rhs) const {
        // You can compare lhs and rhs using a and b here
    }
};

然后将其实例传递给排序函数:

std::sort(v.begin(), v.end(), EdgeComparator(some_value_of_a, some_value_of_b));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多