我有一个坐标数组(结构类型向量),我想先按x坐标对它们进行排序,然后再按y坐标对它们进行排序。除了编写两个单独的快速排序函数外,还有一种方法可以将成员(x或y)作为参数传递,并以此进行排序?
基本上,轴有一种类型的变量,我可以使用它,使得t [i] .axis在轴为x时表示x坐标,而在轴y时表示y坐标
我的结构:
struct point {
float x, y;
};
编辑: 我通过编写一个比较函数来解决该问题,该函数根据轴进行比较,但是如果有人回答了我的问题,我将不胜感激:)
答案 0 :(得分:0)
我不完全理解您的问题。但是,如果要选择要排序的结构成员,则可以使用以下非常简单的函数。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <iomanip>
struct Point {
float x{};
float y{};
friend std::ostream& operator << (std::ostream& os, const Point& p) {
return os << "X: " << std::left << std::setw(6) << p.x << " Y: " << std::setw(6) << p.y << "\n";
}
};
inline void selectiveSort(std::vector<Point>& vp, float Point::* member) {
std::sort(vp.begin(), vp.end(), [&](const Point & p1, const Point & p2) { return p1.*member < p2.*member; });
}
int main(void) {
// Define and initialise vector
std::vector<Point> points{ {1.0,9.0},{2.0,8.0},{3.0,7.0},{4.0,6.0},{5.0,5.0},{6.0,4.0},{7.0,3.0},{8.0,2.0},{9.0,1.0} };
// Sort by y and display result
selectiveSort(points, &Point::y);
std::copy(points.begin(), points.end(), std::ostream_iterator<Point>(std::cout)); std::cout << "\n";
// Sort by x and display result
selectiveSort(points, &Point::x);
std::copy(points.begin(), points.end(), std::ostream_iterator<Point>(std::cout)); std::cout << "\n";
return 0;
}