15

ペアのベクトルをソートするために Johannes Schaub によって投稿されたこの例を見てください。

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

std::sort(a.begin(), a.end(), 
          boost::bind(&std::pair<int, int>::second, _1) <
          boost::bind(&std::pair<int, int>::second, _2));

boost::bind は理解できると思っていましたが、これには問題があります。

質問1:

ソート アルゴリズムは、3 番目のパラメーターとして述語関数を想定しています。ここに表示されるのはブール式です。何が欠けていますか?:

boost::bind(&std::pair<int, int>::second, _1) < boost::bind(&std::pair<int, int>::second, _2)

boost::bind ライブラリは、これら 2 つのバインドに対して operator< をオーバーロードし、何らかの関数ポインター (ラムダなど) を返していますか?

質問 2:
これは私を混乱させます:

boost::bind(&std::pair<int, int>::second, _1)

通常、バインド呼び出しの最初のパラメーターとして何らかの関数ポインターがありますが、ここではクラス メンバーのアドレスですか? その特定のバインドの結果は何ですか?

お時間とご協力ありがとうございます

4

2 に答える 2

14

boost::bind は演算子をオーバーロードします! および関係演算子と論理演算子 ==、!=、<、<=、>、>=、&&、||、これがブール式を「見る」理由ですが、実際には関数述語が返されます。

そこから、オーバーロードされた未満関数の 1 番目と 2 番目の引数のペアの 2 番目のメンバーをバインドしていることがわかります。

2 番目の質問について: ブースト バインドは、ポインターをメンバーに渡したときを認識し、呼び出したかのように扱います。

bind<R>(mem_fun(&std::pair<int,int>::second), args);

これは、ドキュメントがこれを説明する方法です:

メンバーへのポインターで bind を使用する

メンバー関数へのポインターとデータ メンバーへのポインターは、operator() をサポートしていないため、関数オブジェクトではありません。便宜上、bind は最初の引数としてメンバー ポインターを受け入れます。動作は、boost::mem_fn を使用してメンバー ポインターを関数オブジェクトに変換したかのようになります。つまり、表現は

bind(&X::f, 引数)

と同等です

bind(mem_fn(&X::f), 引数)

ここで、R は X::f の戻り値の型 (メンバー関数の場合) またはメンバーの型 (データ メンバーの場合) です。

詳細については、こちらを参照してください。

于 2010-11-15T13:52:13.873 に答える
2

あなたの理論は正しいです。以下を参照してください。

http://www.boost.org/doc/libs/1_44_0/libs/bind/bind.html#operators

于 2010-11-15T13:51:33.480 に答える