DÜZENLEME : c ++ 14 kullanarak, artık tür parametrelere sahip olabilen lambdalar sayesinde en iyi çözümü yazmak çok kolaydır auto
. Bu benim şu anki favori çözümüm
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Sadece özel bir karşılaştırıcı kullanın (isteğe bağlı 3. bağımsız değişken 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());
Bir C ++ 11 derleyicisi kullanıyorsanız, aynısını lambdas kullanarak yazabilirsiniz:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
DÜZENLEME : Sorunuzdaki düzenlemelerinize yanıt olarak, işte bazı düşünceler ... Gerçekten yaratıcı olmak ve bu kavramı çok fazla yeniden kullanmak istiyorsanız, bir şablon hazırlayın:
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);
}
};
o zaman bunu da yapabilirsiniz:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
ya da
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Dürüst olmak gerekirse, bunların hepsi biraz abartılı, sadece 3 satır işlevini yazın ve onunla bitirin :-P