#include <set>
#include <iostream>
using namespace std;
template<class T>
class A
{
public:
A(T a = T(), T b = T()): m_a(a), m_b(b) {}
bool operator<(const A& rhs) const
{
return ((m_a < rhs.m_a) ||
((m_a == rhs.m_a) && (m_b < rhs.m_b))
);
/* alterrnatively:
return std::tie(m_a, m_b) < std::tie(rhs.m_a, rhs.m_b);
*/
}
friend ostream& operator<<(ostream &out, const A& value)
{
return out << value.m_a << ' ' << value.m_b;
}
private:
T m_a;
T m_b;
};
int main()
{
A<int> abc(2,3);
A<int> def(1,5);
set<A<int>> P2D;
P2D.insert(abc);
P2D.insert(def);
for(const auto &elem : P2D) {
cout << elem << endl;
}
return 0;
}
I2luY2x1ZGUgPHNldD4KI2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8Y2xhc3MgVD4gCmNsYXNzIEEgCnsgICAKICAgIHB1YmxpYzoKICAgICAgICBBKFQgYSA9IFQoKSwgVCBiID0gVCgpKTogbV9hKGEpLCBtX2IoYikge30KCiAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQSYgcmhzKSBjb25zdAogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICgobV9hIDwgcmhzLm1fYSkgfHwKICAgICAgICAgICAgICAgICAgICAoKG1fYSA9PSByaHMubV9hKSAmJiAobV9iIDwgcmhzLm1fYikpCiAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAvKiBhbHRlcnJuYXRpdmVseToKICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dGllKG1fYSwgbV9iKSA8IHN0ZDo6dGllKHJocy5tX2EsIHJocy5tX2IpOwogICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICBmcmllbmQgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICZvdXQsIGNvbnN0IEEmIHZhbHVlKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG91dCA8PCB2YWx1ZS5tX2EgPDwgJyAnIDw8IHZhbHVlLm1fYjsKICAgICAgICB9CgogICAgcHJpdmF0ZToKICAgICAgICBUIG1fYTsKICAgICAgICBUIG1fYjsgICAKfTsgIAoKaW50IG1haW4oKSAgIAp7CiAgICBBPGludD4gYWJjKDIsMyk7CiAgICBBPGludD4gZGVmKDEsNSk7CgogICAgc2V0PEE8aW50Pj4gUDJEOwogICAgUDJELmluc2VydChhYmMpOwogICAgUDJELmluc2VydChkZWYpOwoKCWZvcihjb25zdCBhdXRvICZlbGVtIDogUDJEKSB7CgkJY291dCA8PCBlbGVtIDw8IGVuZGw7Cgl9CiAgICAKICAgIHJldHVybiAwOyAgIAp9