EDIT : menggunakan c ++ 14, solusi terbaik adalah sangat mudah untuk menulis berkat lambdas yang sekarang dapat memiliki parameter tipe auto
. Ini adalah solusi favorit saya saat ini
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Cukup gunakan komparator khusus (ini merupakan argumen ke-3 opsional untuk 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());
Jika Anda menggunakan kompiler C ++ 11, Anda dapat menulis yang sama menggunakan 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 : sebagai tanggapan atas suntingan Anda terhadap pertanyaan Anda, inilah beberapa pemikiran ... jika Anda benar-benar ingin menjadi kreatif dan dapat menggunakan kembali konsep ini banyak, cukup buat templat:
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);
}
};
maka Anda dapat melakukan ini juga:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
atau bahkan
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Meskipun jujur, ini semua sedikit berlebihan, tulis saja fungsi 3 baris dan lakukan dengan itu :-P