#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
using namespace std;
template< typename T >
std::pair< T, T > swap_members( std::pair< T, T > pair )
{
using std::swap;
swap( pair.first, pair.second );
return pair;
}
template< typename T, typename U >
bool has_same_first( const std::pair< T, U >& lhs, const std::pair< T, U >& rhs)
{
return lhs.first == rhs.first;
}
template< typename T, typename U >
bool has_smaller_first( const std::pair< T, U >& lhs, const std::pair< T, U >& rhs)
{
return lhs.first < rhs.first;
}
int main() {
vector<pair<int, int>> v1 = { {10, 2}, {10, 1}, {3, 7} };
vector<pair<int, int>> v2 = { {1, 3}, {9, 10} };
std::transform( std::begin( v2 ), std::end( v2 ), std::begin( v2 ), swap_members< int > );
// Insere as coordenadas do novo vetor no original
// e ordena de tal modo que todos os elementos com a primeiro int igual estão juntos
// e o primeiro destes elementos é quem tem o maior segundo inteiro.
v2.insert( std::end( v2 ), std::begin( v1 ), std::end( v1 ) );
std::sort( std::begin( v2 ), std::end( v2 ), std::greater< std::pair< int, int > >{} );
// Garante que apenas a primeira ocorrecia de cada valor do primeiro inteiro será mantida.
auto new_end = std::unique( std::begin( v2 ), std::end( v2 ), has_same_first< int, int > );
v2.erase( new_end, std::end( v2 ) );
for ( auto&& elem : v2 )
{
std::cout << "( " << elem.first << ", " << elem.second << " )";
}
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CnN0ZDo6cGFpcjwgVCwgVCA+IHN3YXBfbWVtYmVycyggc3RkOjpwYWlyPCBULCBUID4gcGFpciApCnsKCXVzaW5nIHN0ZDo6c3dhcDsKCXN3YXAoIHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kICk7CglyZXR1cm4gcGFpcjsKfQoKdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUgPgpib29sIGhhc19zYW1lX2ZpcnN0KCBjb25zdCBzdGQ6OnBhaXI8IFQsIFUgPiYgbGhzLCBjb25zdCBzdGQ6OnBhaXI8IFQsIFUgPiYgcmhzKQp7CglyZXR1cm4gbGhzLmZpcnN0ID09IHJocy5maXJzdDsKfQoKdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUgPgpib29sIGhhc19zbWFsbGVyX2ZpcnN0KCBjb25zdCBzdGQ6OnBhaXI8IFQsIFUgPiYgbGhzLCBjb25zdCBzdGQ6OnBhaXI8IFQsIFUgPiYgcmhzKQp7CglyZXR1cm4gbGhzLmZpcnN0IDwgcmhzLmZpcnN0Owp9CgppbnQgbWFpbigpIHsKICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gdjEgPSB7IHsxMCwgMn0sIHsxMCwgMX0sIHszLCA3fSB9OwogICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiB2MiA9IHsgezEsIDN9LCB7OSwgMTB9IH07CgogICAgc3RkOjp0cmFuc2Zvcm0oIHN0ZDo6YmVnaW4oIHYyICksIHN0ZDo6ZW5kKCB2MiApLCBzdGQ6OmJlZ2luKCB2MiApLCBzd2FwX21lbWJlcnM8IGludCA+ICk7CiAgICAKICAgIC8vIEluc2VyZSBhcyBjb29yZGVuYWRhcyBkbyBub3ZvIHZldG9yIG5vIG9yaWdpbmFsCiAgICAvLyBlIG9yZGVuYSBkZSB0YWwgbW9kbyBxdWUgdG9kb3Mgb3MgZWxlbWVudG9zIGNvbSBhIHByaW1laXJvIGludCBpZ3VhbCBlc3TDo28ganVudG9zCiAgICAvLyBlIG8gcHJpbWVpcm8gZGVzdGVzIGVsZW1lbnRvcyDDqSBxdWVtIHRlbSBvIG1haW9yIHNlZ3VuZG8gaW50ZWlyby4KICAgIHYyLmluc2VydCggc3RkOjplbmQoIHYyICksIHN0ZDo6YmVnaW4oIHYxICksIHN0ZDo6ZW5kKCB2MSApICk7CiAgICBzdGQ6OnNvcnQoIHN0ZDo6YmVnaW4oIHYyICksIHN0ZDo6ZW5kKCB2MiApLCBzdGQ6OmdyZWF0ZXI8IHN0ZDo6cGFpcjwgaW50LCBpbnQgPiA+e30gKTsKICAgIAogICAgLy8gR2FyYW50ZSBxdWUgYXBlbmFzIGEgcHJpbWVpcmEgb2NvcnJlY2lhIGRlIGNhZGEgdmFsb3IgZG8gcHJpbWVpcm8gaW50ZWlybyBzZXLDoSBtYW50aWRhLgogICAgYXV0byBuZXdfZW5kID0gc3RkOjp1bmlxdWUoIHN0ZDo6YmVnaW4oIHYyICksIHN0ZDo6ZW5kKCB2MiApLCBoYXNfc2FtZV9maXJzdDwgaW50LCBpbnQgPiApOwogICAgdjIuZXJhc2UoIG5ld19lbmQsIHN0ZDo6ZW5kKCB2MiApICk7CiAgICAKICAgIGZvciAoIGF1dG8mJiBlbGVtIDogdjIgKQogICAgewogICAgCXN0ZDo6Y291dCA8PCAiKCAiIDw8IGVsZW0uZmlyc3QgPDwgIiwgIiA8PCBlbGVtLnNlY29uZCA8PCAiICkiOwogICAgfQp9