Иногда контейнеры могут содержать вложенные в друг друга структуры данных, и требуется сортировать контейнер, задействуя разные члены данных из вложенных структур.
В таких случаях написание собственной функции сравнения может вызывать трудности, а сами функции могут быть громоздкими. Однако, если вложенными структурами являются классы
std::pair, то задача может существенно упроститься.
Рассмотрим такое объявление вектора
std::vector<std::pair<std::pair<int,int>, std::pair<int,int>>> v =
{
{ { 11, 13 }, { 2, 1 } }, { { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } } ,
{ { 5, 8 }, { 3, 4 } }, { { 12, 14 }, { 2, 7 } }
};
и требуется отсортировать его первично по первому элементу второй пары, а в случае равенства значений - по второму элементу первой пары.
Сделать это не сложно, если использовать стандартную функцию
std::tie, объявленную в заголовке
<tuple>.
Ниже приведена демонстрационная программа.
#include <iostream>
#include <utility>
#include <tuple>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<std::pair<std::pair<int,int>, std::pair<int,int>>> v =
{
{ { 11, 13 }, { 2, 1 } }, { { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } } ,
{ { 5, 8 }, { 3, 4 } }, { { 12, 14 }, { 2, 7 } }
};
for ( const auto &p : v )
{
std::cout << "{ ";
std::cout << "{ " << p.first.first << ", " << p.first.second << " }, ";
std::cout << "{ " << p.second.first << ", " << p.second.second << " } ";
std::cout << "}, ";
}
std::cout << '\n';
std::sort( std::begin( v ), std::end( v ),
[]( const auto &p1, const auto &p2 )
{
return std::tie( p1.second.first, p1.first.second ) <
std::tie( p2.second.first, p2.first.second );
} );
for ( const auto &p : v )
{
std::cout << "{ ";
std::cout << "{ " << p.first.first << ", " << p.first.second << " }, ";
std::cout << "{ " << p.second.first << ", " << p.second.second << " } ";
std::cout << "}, ";
}
std::cout << '\n';
}
Вывод программы на консоль:
{ { 11, 13 }, { 2, 1 } }, { { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } }, { { 5, 8 }, { 3, 4 } }, { { 12, 14 }, { 2, 7 } },
{ { 5, 6 }, { 1, 2 } }, { { 9, 10 }, { 1, 3 } }, { { 11, 13 }, { 2, 1 } }, { { 12, 14 }, { 2, 7 } }, { { 5, 8 }, { 3, 4 } },
Эта тема создана мною на основе вопроса
Sort vector consisting of nested pairs based on different values of pairs with respect to each other?, заданного на сайте Stackoverflow.