2011-07-28 4 views
5
vector<int> vwInts; 
vector<int> vwIntsB; 

for(int i=0; i<10; i++) 
    vwInts.push_back(i); 

transform(vwInts.begin(), vwInts.end(), inserter(vwIntsB, vwIntsB.begin()), 
     bind1st(plus<int>(), 5)); // method one 

transform(vwInts.begin(), vwInts.end(), inserter(vwIntsB, vwIntsB.begin()), 
     bind2nd(plus<int>(), 5)); // method two 

私はbind1stとbind2ndの使い方の違いを知っています。方法1と方法2の両方で私にとって期待される結果が得られます。bind1stまたはbind2ndを使用しますか?

私はbind1stまたはbind2ndのいずれかを使用できるように、この場合(つまり変換の使用法)に大きな違いはないのは本当ですか?

私が今までに見たすべての例は、常に方法2を使用しています。私は上記のbind1stとbind2ndが同じかどうかを知りたいです。

+0

に私は、ブーストに見て、あなたをお勧めします::バインドをお持ちでない場合と同じです。これは、bind1stとbind2ndよりも柔軟性が高く強力です。 –

答えて

4

bind1stは、ファンクションの最初のパラメータをバインドし、bind2ndは2番目のパラメータをバインドします。この場合、2つのパラメータタイプは同じで、operator+は対称であるため、違いはありません。

3

この場合、それぞれ5 + aと+ 5に変換され、まったく同じにコンパイルされます。

6

bind1stは、plus<int>()ファンクタの最初のパラメータにバインドし、bind2ndは、2番目のパラメータをバインドします。 plus<int>の場合は、10+2020+10が同じであるため、違いはありません。

minus<int>とすると、10-2020-10は同じではないため、違いがあります。ただそれをやってみてください。

イラスト:

int main() { 
    auto p1 = bind1st(plus<int>(),10); 
    auto p2 = bind2nd(plus<int>(),10); 
    cout << p1(20) << endl; 
    cout << p2(20) << endl; 

    auto m1 = bind1st(minus<int>(),10); 
    auto m2 = bind2nd(minus<int>(),10); 
    cout << m1(20) << endl; 
    cout << m2(20) << endl; 
    return 0; 
} 

出力:

30 
30 
-10 
10 

デモ:あなたの特定のケースについてはhttp://ideone.com/IfSdt

0

bind1st() 

bind2nd() 

は、と同じである。あなたは、コールがにbind1st(plus<int>(), 5)を使用し、プラスので

plus(5, vwInts) 

下のように見えるだろうというときplus()バイナリ機能オペレータは、だから、

plus(arg1, arg2) 

以下のように見える、ので、このように

は、上記のすべての要素を追加します、です値のベクトルの5

bind2nd(plus<int>(), 5)を使用すると、plus wouそう

plus(vwInts, 5) 

としてのLDの外観は、上記の値5とベクトルのすべての要素を追加します。したがって

の両方があなたのケース

関連する問題