編集:c ++ 14を使用すると、タイプのパラメーターを持つことができるラムダのおかげで、最良のソリューションを非常に簡単に記述できますauto
。これは私の現在のお気に入りのソリューションです
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
元の回答:
カスタムコンパレータを使用するだけです(これはオプションの3番目の引数です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コンパイラを使用している場合は、ラムダを使用して同じように記述できます。
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