排序坐标点c ++

Nic*_*ace 5 c++ algorithm data-structures array-algorithms

在一个应用程序中,我测量了一个模式的很多2d坐标(x,y).该图案由网格上的一组点组成,在x和y方向上具有固定的间距.这些坐标都有质量分数,并按此分数排序.我想要做的是首先在x上排序这些坐标,并定义属于一起的x坐标的组(区域).在此步骤之后,我想对y区域中的不同x区域进行排序.

在此之后,我能够将坐标标记为相应的图案(网格)标签.

示例:测量坐标(x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2) ),(3,3),(3,1)

在步骤1之后:(x,y)=(1,2),(1,3),(1,1)(2,2),(2,3),(2,1)(3,2), (3,3),(3,1)

在第2步之后:(x,y)=(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1) ),(3,2),(3,3)

是否有已执行此任务的排序例程?如果不测量图案的某些坐标,例程也应该有效.

有人可以给我一些线索,我不是一个经验丰富的c ++程序员,但也许有一些提示我可以做这个工作!

And*_*aev 8

您需要一个稳定的排序算法(不会改变相等元素的顺序).首先按y坐标排序,然后按下排序,x得到所需的结果:

std::stable_sort(points.begin(), points.end(), yComparator());
std::stable_sort(points.begin(), points.end(), xComparator());
Run Code Online (Sandbox Code Playgroud)

例如:
before:(x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3, 2),(3,3),(3,1)
按y排序:(x,y)=(2,1),(1,1),(3,1),(2,2),(1) ,2),(3,2),(2,3),(1,3),(3,3)
按x排序:(x,y)=(1,1),(1,2),( 1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)


Fle*_*exo 5

您可以使用std::sort和自定义执行此操作operator<,例如:

#include <algorithm>
#include <vector>

struct coord {
  double x,y,quality;
};

bool operator<(const coord& a, const coord& b) {
  return a.quality < b.quality;
}

int main() {
  std::vector<coord> coords;
  std::sort(coords.begin(), coords.end());
}
Run Code Online (Sandbox Code Playgroud)

如果您不希望将"质量"存储在结构中,您可以随时调用某些函数operator<直接计算它,例如:

double quality(const coord& c);

bool operator<(const coord& a, const coord& b) {
  return quality(a) < quality(b);
}
Run Code Online (Sandbox Code Playgroud)


Sam*_*r83 4

如果您知道数字的范围,您可以将 X 乘以某个大数字,然后将 y 添加到该数字。现在您可以简单地对单个数字进行排序,或者您可以使用 stl 库来完成它,就像其他人所描述的那样。