EDIT : usando c ++ 14, la soluzione migliore è molto semplice da scrivere grazie a lambdas che ora possono avere parametri di tipo auto
. Questa è la mia attuale soluzione preferita
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Basta usare un comparatore personalizzato (è un terzo argomento opzionale per 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());
Se stai usando un compilatore C ++ 11, puoi scrivere lo stesso usando lambdas:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
EDIT : in risposta alle tue modifiche alla tua domanda, ecco alcuni pensieri ... se vuoi davvero essere creativo ed essere in grado di riutilizzare molto questo concetto, basta creare un modello:
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);
}
};
allora puoi farlo anche tu:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
o anche
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Per essere onesto, questo è un po 'eccessivo, basta scrivere la funzione a 3 righe e finirla :-P