#include <iostream>
#include <set>
typedef std::pair<int, int> PairInt;
namespace std
{
template<>
bool operator < (const PairInt& l, const PairInt& r)
{
//swap only if they're unequal to avoid infinite recursion
if (l.first != l.second)
{
//swap elements, considering your special case
if (l.first == r.second && l.second == r.first)
return l < PairInt(r.second, r.first); //call again!
}
//actual comparison is done here
if ( l.first != r.first )
return l.first < r.first;
else
return l.second < r.second;
}
}
int main()
{
std::set<PairInt> intSet;
intSet.insert(PairInt(1,3));
intSet.insert(PairInt(1,4));
intSet.insert(PairInt(1,4));
intSet.insert(PairInt(4,1));
for(auto it = intSet.begin(); it != intSet.end(); ++it)
std::cout << it->first << "," << it->second << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgoKdHlwZWRlZiAgc3RkOjpwYWlyPGludCwgaW50PiBQYWlySW50OwoKbmFtZXNwYWNlIHN0ZAp7CnRlbXBsYXRlPD4KYm9vbCBvcGVyYXRvciA8IChjb25zdCBQYWlySW50JiBsLCBjb25zdCBQYWlySW50JiByKSAKewogICAgLy9zd2FwIG9ubHkgaWYgdGhleSdyZSB1bmVxdWFsIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbgogICAgaWYgKGwuZmlyc3QgIT0gbC5zZWNvbmQpIAogICAgewogICAgICAgICAvL3N3YXAgZWxlbWVudHMsIGNvbnNpZGVyaW5nIHlvdXIgc3BlY2lhbCBjYXNlCiAgICAgICAgICBpZiAobC5maXJzdCA9PSByLnNlY29uZCAmJiBsLnNlY29uZCA9PSByLmZpcnN0KQogICAgICAgICAgICAgcmV0dXJuIGwgPCBQYWlySW50KHIuc2Vjb25kLCByLmZpcnN0KTsgLy9jYWxsIGFnYWluIQogICAgfQoKICAgLy9hY3R1YWwgY29tcGFyaXNvbiBpcyBkb25lIGhlcmUKICAgaWYgKCBsLmZpcnN0ICE9IHIuZmlyc3QgKQogICAgICAgIHJldHVybiBsLmZpcnN0IDwgci5maXJzdDsKICAgZWxzZSAKICAgICAgICByZXR1cm4gbC5zZWNvbmQgPCByLnNlY29uZDsKfQp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6c2V0PFBhaXJJbnQ+IGludFNldDsKICAgIGludFNldC5pbnNlcnQoUGFpckludCgxLDMpKTsKICAgIGludFNldC5pbnNlcnQoUGFpckludCgxLDQpKTsKICAgIGludFNldC5pbnNlcnQoUGFpckludCgxLDQpKTsKICAgIGludFNldC5pbnNlcnQoUGFpckludCg0LDEpKTsKICAgIGZvcihhdXRvIGl0ID0gaW50U2V0LmJlZ2luKCk7IGl0ICE9IGludFNldC5lbmQoKTsgKytpdCkKICAgICAgICAgICBzdGQ6OmNvdXQgPDwgaXQtPmZpcnN0IDw8ICIsIiA8PCBpdC0+c2Vjb25kICA8PCBzdGQ6OmVuZGw7Cn0=