On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.06.19 17:41. Заголовок: Написание собственных функций сравнения для std::sort


Иногда контейнеры могут содержать вложенные в друг друга структуры данных, и требуется сортировать контейнер, задействуя разные члены данных из вложенных структур.

В таких случаях написание собственной функции сравнения может вызывать трудности, а сами функции могут быть громоздкими. Однако, если вложенными структурами являются классы 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.

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 22
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет