bind函数
终于知道一个lambda的用法了,就是有的函数参数需另一个函数,但是该函数规定了你另一个函数的参数个数,类型
比如快排函数sort(beg,end,cmp),第三个cmp函数必须只能是两个排序集合的两个对象。但是我有个需求,我还想传入一个n变量,如果n==1 就返回a和b的比较结果,如果n==0 就直接返回a大于b(不管a是否真的大于b)。问题就是,我怎么把n的值传进去。
聪明的你想到了lambda表达式的捕获列表,这就一个必须用lambda的例子。当然这个问题还有其他扫操作去解决,就是bind函数。
bind就是用一个新的函数传参去映射调用另一个函数。说不清楚我们看一下代码就好了。
cmp(int a,int b,int n);//这个函数是不能传到sort里的
auto cmp1=bind(cmp , _1 , _2 , 1 )//于是用cmp1映射到cmp,
cmp1(1,2) <==> cmp( 1 , 2 , 1 )//调用cmp1(1,2)就会映射到去调用cmp( 1 , 2 , 1 )
sort(beg,end,cmp1);//所以我们就可以通过cmp1当做sort的参数
知道他是个什么玩意以后就来具体看看auto cmp1=bind(cmp , _1 , _2 , 1 )
第一个参数是被绑定的函数。
第二个参数第一次看上去有点懵逼,但结合上下代码基本能猜出他就是占用一个位置,表示映射函数的参数,并给被映射的函数传递对应参数。
第三个参数是说调用cmp1时映射给第三个参数就是固定的1
_n是站位符,定义在std::placeholdrs::里。
这个站位符不仅仅是站位,他还表示映射到原函数的第几个参数。
所以可以用它来进行参数的重新排序
这个玩一说起来贼多,还不容易说清楚,我们简单的看一下对应关系就很容易找到规则啦。
仍然那cmp为例,下面只是对bind的学习,不考虑sort了。
auto cmp1=bind(cmp , _1 , _2 , n )
cmp1( a , b ) <==> cmp( a , b , n )
auto cmp2=bind(cmp , _1 , 3 , _2 )
cmp2( a , n) <==> cmp( a , 3 , n )
auto cmp3=bind(cmp , _2 , _1 , 0 )
cmp3( a , b ) <==> cmp( b , a , 0 )//注意这里上面定义的 _1 , _2还代表顺序。
看了这个基本知道了这个占用符的小秘密。接下来就是最后一个问题。lambda可以捕获引用,那么bind可以绑定一个引用参数吗?
答案是可以的,但是比较麻烦。
cmp(int &a,int &b,int &n)
auto f=bind(cmp,_1,_2,fef(n));//n引用
auto f2=bind(cmp,_1,_2,cfef(n));//n常引用