EDYCJA : używając c ++ 14, najlepsze rozwiązanie jest bardzo łatwe do napisania dzięki lambdom, które mogą teraz mieć parametry typu auto
. To moje obecnie ulubione rozwiązanie
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Po prostu użyj niestandardowego komparatora (jest to opcjonalny trzeci argument do 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());
Jeśli używasz kompilatora C ++ 11, możesz napisać to samo używając lambd:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
EDYTUJ : w odpowiedzi na zmiany w Twoim pytaniu, oto kilka przemyśleń ... jeśli naprawdę chcesz być kreatywny i móc wielokrotnie wykorzystywać tę koncepcję, po prostu utwórz szablon:
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);
}
};
wtedy też możesz to zrobić:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
lub nawet
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Chociaż szczerze mówiąc, to wszystko jest trochę przesadzone, po prostu napisz funkcję 3-liniową i skończ z tym :-P