EDIT : sử dụng c ++ 14, giải pháp tốt nhất là rất dễ viết nhờ lambdas hiện có thể có các tham số về loại auto
. Đây là giải pháp yêu thích hiện tại của tôi
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Chỉ cần sử dụng một bộ so sánh tùy chỉnh (đó là đối số thứ 3 tùy chọn 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());
Nếu bạn đang sử dụng trình biên dịch C ++ 11, bạn có thể viết tương tự bằng 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 : để trả lời các chỉnh sửa của bạn cho câu hỏi của bạn, đây là một số suy nghĩ ... nếu bạn thực sự muốn sáng tạo và có thể sử dụng lại khái niệm này rất nhiều, chỉ cần tạo một mẫu:
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);
}
};
sau đó bạn cũng có thể làm điều này:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
hoặc thậm chí
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Mặc dù thành thật mà nói, đây là một chút quá mức cần thiết, chỉ cần viết hàm 3 dòng và được thực hiện với nó :-P