1. ホーム
  2. c++

[解決済み] ペアの2番目の要素に基づいてペアのベクトルをソートするにはどうすればよいですか?

2022-02-06 11:14:31

質問内容

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

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

のリストを簡単にソートする方法はありますか? 増加中 の順序を、ペアの2番目の要素に基づいて決定する必要があります。

ちょっとした関数オブジェクトを書けばいいのは分かっているのですが、 既存の STL std::less を直接行うのですか?

EDIT: ソートするための第3引数に渡す関数やクラスを別に書けばいいということは理解しました。 問題は、それを標準的なものから構築できるかどうかです。 本当はこんな感じのものがいいんだけど。

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

解決方法は?

EDIT : c++14 を使っている場合、最適な解決策は、ラムダが型のパラメータを持つことができるようになったおかげで、非常に簡単に書くことができます。 auto . これは、私の現在のお気に入りの解決策です。

std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
    return left.second < right.second;
});


オリジナル回答 :

カスタムコンパレータを使用すればよいのです。 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;
});

EDIT : 質問に対するあなたの編集に応えて、ここにいくつかの考えを述べます. もし 本当に クリエイティブに、そしてこのコンセプトをたくさん再利用できるようにしたいのであれば、テンプレートを作ればいいのです。

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