Как я сортирую вектор пар на основе второго элемента пары?

125
задан Angie Quijano 13 April 2016 в 21:20
поделиться

4 ответа

РЕДАКТИРОВАНИЕ : с помощью C++ 14, лучшее решение очень легко записать благодаря лямбдам, которые могут теперь иметь параметры типа auto. , Это - мое текущее любимое решение

std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
    return left.second < right.second;
});
<час>

, Просто используют пользовательский компаратор (это - дополнительный 3-й аргумент std::sort)

struct sort_pred {
    bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
        return left.second < right.second;
    }
};

std::sort(v.begin(), v.end(), sort_pred());

при использовании C++ 11 компиляторов можно записать те же лямбды использования:

std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
    return left.second < right.second;
});

РЕДАКТИРОВАНИЕ : в ответ на Ваши редактирования к Вашему вопросу вот некоторые мысли..., если Вы действительно хотите быть творческими и быть в состоянии снова использовать это понятие много, просто сделайте шаблон:

template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
    bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
        Pred p;
        return p(left.second, right.second);
    }
};

тогда можно сделать это также:

std::sort(v.begin(), v.end(), sort_pair_second<int, int>());

или даже

std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());

, Хотя честно говоря, это - все немного излишества, просто пишут 3 функции строки и делаются с ним:-P

192
ответ дан Evan Teran 24 November 2019 в 00:57
поделиться

Можно использовать повышение как это:

std::sort(a.begin(), a.end(), 
          boost::bind(&std::pair<int, int>::second, _1) <
          boost::bind(&std::pair<int, int>::second, _2));

я не знаю стандартный способ сделать это одинаково короткое и краткое, но можно захватить boost::bind, он все состоит из заголовков.

71
ответ дан Johannes Schaub - litb 24 November 2019 в 00:57
поделиться

Для чего-то допускающего повторное использование:

template<template <typename> class P = std::less >
struct compare_pair_second {
    template<class T1, class T2> bool operator()(const std::pair<T1, T2>& left, const std::pair<T1, T2>& right) {
        return P<T2>()(left.second, right.second);
    }
};

можно использовать его в качестве

std::sort(foo.begin(), foo.end(), compare_pair_second<>());

или

std::sort(foo.begin(), foo.end(), compare_pair_second<std::less>());
5
ответ дан Leon Timmermans 24 November 2019 в 00:57
поделиться

Необходимо было бы полагаться на нестандартное select2nd

1
ответ дан Greg Rogers 24 November 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: