РЕДАКТИРОВАТЬ : используя С ++ 14, лучшее решение очень легко написать благодаря лямбдам, которые теперь могут иметь параметры типа auto
. Это мое любимое решение на данный момент
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Просто используйте собственный компаратор (это необязательный третий аргумент 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> >());
Хотя, честно говоря, это все немного переборщило, просто напишите трехстрочную функцию и покончите с этим :-P