您可以通过使用大于比较而不是默认的小于来反转任何范围的排序:
std::sort(values.begin(), values.end(), std::greater<std::pair<string, int>>());
或者,您可以颠倒迭代顺序:
std::sort(values.rbegin(), values.rend());
编辑 如果您想更改比较标准,首先按对的second 进行字典比较,然后是first,您可以提供自己的比较功能。它仍必须满足strict weak ordering 的要求,如上例所示。使用std::tie 实现字典比较很简单:
#include <tuple>
template<typename T1, typename T2>
struct pair_backwards_greater
{
bool operator()(const std::pair<T1, T2>& lhs, const std::pair<T1, T2>& rhs) const
{
return std::tie(lhs.second, lhs.first) > std::tie(rhs.second, rhs.first);
}
};
然后
std::sort(values.begin(), values.end(), pair_backwards_greater<string, int>());
您还可以选择使用简单的 lambda 表达式,而不是手动编写仿函数:
std::sort(values.begin(), values.end(),
[](const std::pair<std::string, int> &lhs, const std::pair<std::string, int> &rhs)
{
return std::tie(lhs.second, lhs.first) > std::tie(rhs.second, rhs.first);
}
);
std::tie 需要 C++11 库支持,但在 boost::tie 和 std::tr1::tie 中有 C++03 替代实现。 Lambda 表达式需要 C++11 语言支持。