113


60

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

ペアのベクトルがあるとします。

std::vector > vec;

ペアの2番目の要素に基づいて昇順にリストをソートする簡単で簡単な方法はありますか?

その仕事をする小さな関数オブジェクトを書くことができることを私は知っていますが、_STL_と `std

less`の既存の部分を直接使って仕事をする方法はありますか?

編集:私は私がソートする3番目の引数に渡すために別の関数やクラスを書くことができることを理解しています。 問題は、私が標準的なものからそれを構築できるかどうかです。 私は本当に何かのようになります:

std::sort(vec.begin(), vec.end(), std::something_magic());

7 Answer


183


  • EDIT :c 14を使うと、現在は `auto`型のパラメータを持つことができるラムダのおかげで最善の解決法はとても簡単に書けます。 *これが私の現在のお気に入りの解決策です

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

'' '' '

カスタムコンパレータを使うだけです(これは `std

sort`のオプションの3番目の引数です)

struct sort_pred {
    bool operator()(const std::pair &left, const std::pair &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 &left, const std::pair &right) {
    return left.second < right.second;
});

編集:あなたの質問に対するあなたの編集に応じて、ここにいくつかの考えがあります . *本当に*創造的で、このコンセプトを再利用できるようにしたいなら たくさん、テンプレートを作るだけです:

template  >
struct sort_pair_second {
    bool operator()(const std::pair&left, const std::pair&right) {
        Pred p;
        return p(left.second, right.second);
    }
};

それからあなたもこれを行うことができます:

std::sort(v.begin(), v.end(), sort_pair_second());

あるいは

std::sort(v.begin(), v.end(), sort_pair_second >());

正直に言うと、これは少しやり過ぎです。3行の関数を書いてそれを使ってください:-P


70


あなたはこのようにブーストを使用することができます:

std::sort(a.begin(), a.end(),
          boost::bind(&std::pair::second, _1) <
          boost::bind(&std::pair::second, _2));
これを短く簡潔にするための標準的な方法はわかりませんが、 `boost

bind`はすべてヘッダーで構成されています。


29


C 0xでは、ラムダ関数を使うことができます。

using namespace std;
vector> v;
        .
        .
sort(v.begin(), v.end(),
     [](const pair& lhs, const pair& rhs) {
             return lhs.second < rhs.second; } );

この例では、戻り型 `bool`が暗黙のうちに推測されます。

ラムダ戻り型

ラムダ関数が単一のステートメントを持ち、これがreturnステートメントである場合、コンパイラーは戻りタイプを推測できます。 C 11から§5.1.2/ 4:

_ _ …​

  • 複合文の形式が `{return expression; } ` 左辺値から右辺値への変換(4.1)、配列からポインターへの変換(4.2)、および関数からポインターへの変換(4.3)後に返される式のタイプ。

  • そうでなければ、 void_ _

戻り値の型を明示的に指定するには、次のように `[]() - > Type {}`という形式を使います。

sort(v.begin(), v.end(),
     [](const pair& lhs, const pair& rhs) -> bool {
             if (lhs.second == 0)
                 return true;
             return lhs.second < rhs.second; } );


25


それは非常に簡単ですあなたはアルゴリズムからソート機能を使用し、あなた自身の比較機能を追加する

ベクトル<ペア> v; sort(v.begin()、v.end()、myComparison);

今度は2番目の選択に基づいて比較を行う必要があるので、「myComparison」を次のように宣言します。

myComparison(定数ペア)


5


再利用可能なもののために:

テンプレートクラスP = std :: less> struct compare_pair_second {テンプレートブール演算子()(const std :: pair)

あなたはそれを使用することができます

std :: sort(foo.begin()、foo.end()、compare_pair_second <>());

または

std :: sort(foo.begin()、foo.end()、compare_pair_second());


1


あなたは非標準の select2ndに頼らなければならないでしょう


-1


通常通り `std

sort()`を使用できるように、ペアの要素を交換してみてください。