EDIT: sử dụng C++ 14, giải pháp tốt nhất là rất dễ dàng để viết nhờ để lambdas mà bây giờ có thể có các tham số của loại auto
. Đây là giải pháp của tôi yêu thích hiện nay
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Chỉ cần sử dụng một so sánh tùy chỉnh (đó là một cuộc tranh cãi 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 một trình biên dịch C++ 11 , bạn có thể viết cùng một cách sử dụ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: để đáp ứng với sửa đổi của bạn cho câu hỏi của bạn, sau đây là một vài suy nghĩ ... nếu bạn thực sự muốn được sáng tạo và có khả năng tái sử dụng khái niệm này rất nhiều, chỉ cần làm cho 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ó thể làm điều này quá:
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ù phải trung thực, đây là tất cả một chút quá mức cần thiết, chỉ cần viết các chức năng dòng 3 và được thực hiện với nó :-P
C++ không có lamdas để bạn không thể thực hiện chính xác những gì bạn muốn, bạn sẽ cần tạo một hàm/hàm riêng biệt. Đây có thể là một lớp lót nên nó thực sự không phải là một vấn đề lớn. –
Dưới đây là ví dụ:
[std :: sắp xếp theo vectơ các cặp] (http://www.codeguru.com/forum/archive/index.php/t-325645.html) – LeppyR64