ペアのベクトルをペアの 2 番目の要素に基づいて並べ替えるにはどうすればよいでしょうか? 質問する

ペアのベクトルをペアの 2 番目の要素に基づいて並べ替えるにはどうすればよいでしょうか? 質問する

ペアのベクトルがある場合:

std::vector<std::pair<int, int> > vec;

リストを並べ替える簡単な方法はありますか?増加ペアの 2 番目の要素に基づいて順序付けますか?

小さな関数オブジェクトを書いて作業を行うことはできますが、既存の部分を使用する方法はあるでしょうか?言語そしてstd::less直接仕事をするのですか?

編集: ソートの 3 番目の引数に渡す別の関数またはクラスを作成できることは理解しています。問題は、それを標準的なものから構築できるかどうかです。実際には次のようなものになります。

std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());

ベストアンサー1

編集: 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

おすすめ記事