デフォルトの小なり比較の代わりに大なり比較を使用して、任意の範囲のソートを反転できます。
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>());
ファンクターを手動で記述する代わりに、単純なラムダ式を使用するオプションもあります。
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 ライブラリのサポートが必要ですが、 と には C++03 の代替実装がboost::tie
ありstd::tr1::tie
ます。ラムダ式には、C++11 言語のサポートが必要です。