#include <iostream>
#include <string>
#include <set>
#include <tuple>
#include <vector>
#include <algorithm>
using namespace std;
class Point
{
public:
Point(double x, double y, double z):_x(x),_y(y),_z(z) {}
double x(void) const { return _x; }
double y(void) const { return _y; }
double z(void) const { return _z; }
double& x(void) { return _x; }
double& y(void) { return _y; }
double& z(void) { return _z; }
double _x,_y,_z;
};
struct Xitem
{
int ID;
Point eP;
};
class X_Struct_Sorter
{
public:
X_Struct_Sorter(){}
bool operator()(Xitem a,Xitem b)
{
return std::tie(a.eP.x(),a.eP.y(),a.eP.z(),a.ID)
<std::tie(b.eP.x(),b.eP.y(),b.eP.z(),b.ID);
}
};
int main() {
vector<Xitem> items = { { 0, Point(1,0,0) }, { 1, Point(0,0,0) }, { 2, Point(0,-1,0) } };
for (auto x : items)
{
std::cout << x.eP.x() << ", " << x.eP.y() << ", " << x.eP.z() << ", " << x.ID << std::endl;
}
std::cout << "Sorted:" << std::endl;
std::sort(items.begin(), items.end(), X_Struct_Sorter());
for (auto x : items)
{
std::cout << x.eP.x() << ", " << x.eP.y() << ", " << x.eP.z() << ", " << x.ID << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgUG9pbnQKewoJcHVibGljOgoJUG9pbnQoZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeik6X3goeCksX3koeSksX3ooeikge30KICAgIGRvdWJsZSB4KHZvaWQpIGNvbnN0IHsgcmV0dXJuIF94OyB9CiAgICBkb3VibGUgeSh2b2lkKSBjb25zdCB7IHJldHVybiBfeTsgfQogICAgZG91YmxlIHoodm9pZCkgY29uc3QgeyByZXR1cm4gX3o7IH0KCiAgICBkb3VibGUmIHgodm9pZCkgeyByZXR1cm4gX3g7IH0KICAgIGRvdWJsZSYgeSh2b2lkKSB7IHJldHVybiBfeTsgfQogICAgZG91YmxlJiB6KHZvaWQpIHsgcmV0dXJuIF96OyB9CiAgICAKICAgIGRvdWJsZSBfeCxfeSxfejsKfTsKCnN0cnVjdCBYaXRlbQp7CiAgICBpbnQgSUQ7CiAgICBQb2ludCBlUDsKfTsKCgogIGNsYXNzIFhfU3RydWN0X1NvcnRlcgogIHsKICBwdWJsaWM6CiAgICAgICBYX1N0cnVjdF9Tb3J0ZXIoKXt9CiAgICAgICBib29sIG9wZXJhdG9yKCkoWGl0ZW0gYSxYaXRlbSBiKQogICAgICAgewogICAgICAgICAgICByZXR1cm4gc3RkOjp0aWUoYS5lUC54KCksYS5lUC55KCksYS5lUC56KCksYS5JRCkKICAgICAgICAgICAgICAgICAgICAgPHN0ZDo6dGllKGIuZVAueCgpLGIuZVAueSgpLGIuZVAueigpLGIuSUQpOwogICAgICAgfQoKICB9OwoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8WGl0ZW0+IGl0ZW1zID0geyB7IDAsIFBvaW50KDEsMCwwKSB9LCB7IDEsIFBvaW50KDAsMCwwKSB9LCB7IDIsIFBvaW50KDAsLTEsMCkgfSB9OwoJCgkJZm9yIChhdXRvIHggOiBpdGVtcykKCXsKCQlzdGQ6OmNvdXQgPDwgeC5lUC54KCkgPDwgIiwgIiA8PCB4LmVQLnkoKSA8PCAiLCAiIDw8IHguZVAueigpIDw8ICIsICIgPDwgeC5JRCA8PCBzdGQ6OmVuZGw7Cgl9CglzdGQ6OmNvdXQgPDwgIlNvcnRlZDoiIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6c29ydChpdGVtcy5iZWdpbigpLCBpdGVtcy5lbmQoKSwgWF9TdHJ1Y3RfU29ydGVyKCkpOwoJCglmb3IgKGF1dG8geCA6IGl0ZW1zKQoJewoJCXN0ZDo6Y291dCA8PCB4LmVQLngoKSA8PCAiLCAiIDw8IHguZVAueSgpIDw8ICIsICIgPDwgeC5lUC56KCkgPDwgIiwgIiA8PCB4LklEIDw8IHN0ZDo6ZW5kbDsKCX0KCXJldHVybiAwOwp9
1, 0, 0, 0
0, 0, 0, 1
0, -1, 0, 2
Sorted:
0, -1, 0, 2
0, 0, 0, 1
1, 0, 0, 0