Форум » C/C++ для начинающих (C/C++ for beginners) » Написание собственных функций сравнения для std::sort » Ответить

Написание собственных функций сравнения для std::sort

Сыроежка: Иногда контейнеры могут содержать вложенные в друг друга структуры данных, и требуется сортировать контейнер, задействуя разные члены данных из вложенных структур. В таких случаях написание собственной функции сравнения может вызывать трудности, а сами функции могут быть громоздкими. Однако, если вложенными структурами являются классы std::pair, то задача может существенно упроститься. Рассмотрим такое объявление вектора [pre2] 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 } } };[/pre2] и требуется отсортировать его первично по первому элементу второй пары, а в случае равенства значений - по второму элементу первой пары. Сделать это не сложно, если использовать стандартную функцию std::tie, объявленную в заголовке <tuple>. Ниже приведена демонстрационная программа. [pre2] #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'; }[/pre2] Вывод программы на консоль: [pre2] { { 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 } }, [/pre2] Эта тема создана мною на основе вопроса Sort vector consisting of nested pairs based on different values of pairs with respect to each other?, заданного на сайте Stackoverflow.

Ответов - 0



полная версия страницы