c++ bind函数

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常引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值