编辑:使用 c++14,最好的解决方案很容易编写,这要归功于现在可以具有 type 参数的 lambdas auto
。这是我目前最喜欢的解决方案
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
原始答案:
只需使用自定义比较器(它是可选的第三个参数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());
如果您使用的是 C++11 编译器,则可以使用 lambdas 编写相同的代码:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
编辑:针对您对问题的编辑,这里有一些想法......如果您真的想有创意并且能够大量重用这个概念,只需制作一个模板:
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);
}
};
那么你也可以这样做:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
甚至
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
虽然说实话,这有点矫枉过正,只需编写 3 行函数并完成它:-P