使用bind1st还是bind2nd?

q09*_*987 5 c++ stl

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
Run Code Online (Sandbox Code Playgroud)

我知道bind1st和bind2nd之间的用法差异,方法一和方法二都为我提供了预期的结果.

在这种情况下(即转换的使用)没有大的区别,这样我可以使用bind1st或bind2nd吗?

因为,到目前为止我看到的所有例子总是使用方法二.我想知道在上面的例子中bind1st和bind2nd是否相同.

Naw*_*waz 6

bind1st绑定plus<int>()仿函数的第一个参数,并bind2nd绑定第二个参数.在这种情况下plus<int>,它没有任何区别,10+20并且20+10是相同的.

但是,如果你这样做minus<int>,它会产生差异,因为10-20并且20-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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

 30
 30
-10
 10
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/IfSdt


Mar*_*k B 4

bind1st绑定函数的第一个参数,同时bind2nd绑定第二个参数。由于在这种情况下两个参数类型相同并且operator+是对称的,因此没有区别。