EDIT : використовуючи 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;
});
EDIT : у відповідь на ваші зміни на ваше запитання, ось кілька думок ... якщо ви дійсно хочете проявити творчість і вмієте багаторазово використовувати це поняття, просто створіть шаблон:
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