Почти наверняка проще всего использовать std::sort
вместо qsort
:
class Point {
int x, y, z;
public:
Point(int x, int y, int z) : x(x), y(y), z(z) {}
bool operator<(Point const &other) {
return x < other.x;
}
// skipping the reading and other stuff for now...
};
int main() {
std::vector<Point> points;
// add some Points to `points` here.
// sort using order defined in Point::operator<:
std::sort(points.begin(), points.end());
return 0;
}
Редактировать: чтобы сохранить сравнение отдельно от сравниваемых элементов, вы используете отдельную функцию или функтор для выполнениясравните и передайте это std::sort
.В вашем классе есть несколько вещей, которые вы действительно хотите изменить в любом случае - по крайней мере, так как ваши Point::X()
, Point::Y()
и Point::Z()
не изменяют объект Point, вы хотите сделатьих const
функций-членов.Как только вы это сделаете, сортировка будет довольно тривиальной:
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
class Point {
double x, y, z;
public:
double X() const { return x; }
double Y() const { return y; }
double Z() const { return z; }
Point(double x=0.0, double y=0.0, double z=0.0) : x(x), y(y), z(z) {}
};
namespace std {
ostream &operator<<(ostream &os, Point const &p) {
return os << "(" << p.X() << ", " << p.Y() << ", " << p.Z() << ")";
}
}
struct byX {
bool operator()(Point const &a, Point const &b) {
return a.X() < b.X();
}
};
int main(){
std::vector<Point> points;
for (int i=0; i<10; i++)
points.push_back(Point(rand(), i, i));
std::cout << "Unsorted:\n";
std::copy(points.begin(), points.end(),
std::ostream_iterator<Point>(std::cout, "\n"));
std::sort(points.begin(), points.end(), byX());
std::cout << "\nSorted:\n";
std::copy(points.begin(), points.end(),
std::ostream_iterator<Point>(std::cout, "\n"));
return 0;
}
Технически, я полагаю, я должен добавить еще одну незначительную деталь: если значение x
в любой из ваших точек является NaN, этоне будет работать правильноNaN не равен чему-либо (даже самому себе), что нарушает строгий слабый порядок, необходимый для std::sort
.