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之间的用法区别,方法一和方法二都为我提供了预期的结果。
这种情况(即转换的使用)没有太大区别,这样我可以使用bind1st或bind2nd吗?
因为,到目前为止我看到的所有例子总是使用方法二。我想知道在上面的例子中bind1st和bind2nd是否相同。
答案 0 :(得分: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;
}
输出:
30
30
-10
10
答案 1 :(得分:4)
bind1st
绑定函数的第一个参数,而bind2nd
绑定第二个参数。由于这两种参数类型在这种情况下是相同的,operator+
是对称的,所以没有区别。
答案 2 :(得分:3)
在这种情况下,它们分别转换为5 + a和a + 5,它们被编译为完全相同。
答案 3 :(得分:0)
针对您的具体情况
bind1st()
和
bind2nd()
相同。
因此,plus()
二元函数运算符如下所示
plus(arg1, arg2)
因此,当您使用bind1st(plus<int>(), 5)
时,对plus的调用将显示为
plus(5, vwInts)
因此,上面将使用值5
当您使用bind2nd(plus<int>(), 5)
时,对plus的调用将显示为
plus(vwInts, 5)
因此,上面将使用值5
添加vector的每个元素。
因此在您的情况下都是相同的