BEARBEITEN : Mit c ++ 14 ist die beste Lösung dank Lambdas, die jetzt Parameter vom Typ haben können, sehr einfach zu schreiben auto
. Dies ist meine derzeitige Lieblingslösung
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Verwenden Sie einfach einen benutzerdefinierten Komparator (dies ist ein optionales drittes Argument für 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());
Wenn Sie einen C ++ 11-Compiler verwenden, können Sie dasselbe mit Lambdas schreiben:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
BEARBEITEN : Als Antwort auf Ihre Änderungen an Ihrer Frage sind hier einige Gedanken ... Wenn Sie wirklich kreativ sein und dieses Konzept häufig wiederverwenden möchten, erstellen Sie einfach eine Vorlage:
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);
}
};
dann kannst du das auch machen:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
oder auch
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Um ehrlich zu sein, ist das alles ein bisschen übertrieben. Schreiben Sie einfach die 3-Zeilen-Funktion und fertig :-P