#include <iostream>
#include <algorithm>
#include <vector>
#include <initializer_list>
#include <cassert>
using namespace std;
template<typename T>
std::ostream& operator<<(std::ostream& out, const std::vector<T>& v){
for(const auto& el : v){
out << el << '\n';
}
return out;
}
class A {
int a;
int b;
public:
A(std::initializer_list<int> l){
assert(l.size() == 2);
auto i = l.begin();
a = *i;
++i;
b = *i;
}
friend std::ostream& operator<<(std::ostream& stream, const A& e){
return stream << e.a << ' ' << e.b;
}
static bool compareViaA(const A& lhs, const A& rhs){
return rhs.a > lhs.a;
}
static bool compareViaB(const A& lhs, const A& rhs){
return rhs.b > lhs.b;
}
};
int main() {
std::vector<A> v {{2,3}, {3,2}, {1,4}, {4,1}};
//sort(v.begin(), v.end(), [](const A& a, const A& b){return a.a > b.a;}) // fails because of privacy violation
sort(v.begin(), v.end(), A::compareViaA);
std::cout << v << '\n';
sort(v.begin(), v.end(), A::compareViaB);
std::cout << v << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPGNhc3NlcnQ+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2KXsKCWZvcihjb25zdCBhdXRvJiBlbCA6IHYpewoJCW91dCA8PCBlbCA8PCAnXG4nOwoJfQoJcmV0dXJuIG91dDsKfQoKY2xhc3MgQSB7CglpbnQgYTsKCWludCBiOwpwdWJsaWM6CglBKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQ+IGwpewoJCWFzc2VydChsLnNpemUoKSA9PSAyKTsKCQlhdXRvIGkgPSBsLmJlZ2luKCk7CgkJYSA9ICppOwoJCSsraTsKCQliID0gKmk7Cgl9CgkKCWZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBzdHJlYW0sIGNvbnN0IEEmIGUpewoJCXJldHVybiBzdHJlYW0gPDwgZS5hIDw8ICcgJyA8PCBlLmI7Cgl9CgkKCXN0YXRpYyBib29sIGNvbXBhcmVWaWFBKGNvbnN0IEEmIGxocywgY29uc3QgQSYgcmhzKXsKCQlyZXR1cm4gcmhzLmEgPiBsaHMuYTsKCX0KCQoJc3RhdGljIGJvb2wgY29tcGFyZVZpYUIoY29uc3QgQSYgbGhzLCBjb25zdCBBJiByaHMpewoJCXJldHVybiByaHMuYiA+IGxocy5iOwoJfQp9OwoKaW50IG1haW4oKSB7CglzdGQ6OnZlY3RvcjxBPiB2IHt7MiwzfSwgezMsMn0sIHsxLDR9LCB7NCwxfX07CgkvL3NvcnQodi5iZWdpbigpLCB2LmVuZCgpLCBbXShjb25zdCBBJiBhLCBjb25zdCBBJiBiKXtyZXR1cm4gYS5hID4gYi5hO30pIC8vIGZhaWxzIGJlY2F1c2Ugb2YgcHJpdmFjeSB2aW9sYXRpb24KCXNvcnQodi5iZWdpbigpLCB2LmVuZCgpLCBBOjpjb21wYXJlVmlhQSk7CglzdGQ6OmNvdXQgPDwgdiA8PCAnXG4nOwoJc29ydCh2LmJlZ2luKCksIHYuZW5kKCksIEE6OmNvbXBhcmVWaWFCKTsKCXN0ZDo6Y291dCA8PCB2IDw8ICdcbic7CglyZXR1cm4gMDsKfQ==