您可以使用大于比较而不是默认的小于来反转任何范围的排序:
std::sort(values.begin(), values.end(), std::greater<std::pair<string, int>>());
或者,您可以颠倒迭代顺序:
std::sort(values.rbegin(), values.rend());
编辑如果您想更改比较标准以按对的second
第一个和first
下一个按字典顺序进行比较,您可以提供自己的比较功能。它仍然必须满足上面示例中的严格弱排序。字典比较很容易实现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
和中有 C++03 替代实现std::tr1::tie
。Lambda 表达式需要 C++11 语言支持。