10.3 定制化操作 [p347]

一 lambda表达式

1. 组成:返回类型、捕获列表、参数列表、函数体;捕获列表、函数体不可缺少
   auto f = [ ] {return 42;} 该函数的调用也需要使用( ),f( );
   [ ](const string& a, const string& b) {return a.size() < b.size(); }

2. 捕获变量
1)lambda表达式可以出现在一个函数内部,使用其局部变量,但是只能使用那些明确指明          的变量;

2)一个lambda通过将局部变量包含在捕获列表中来指明将会使用这些变量;

     捕获列表指引lambda在其内部包含访问局部变量所需的信息;

     只有在捕获列表中捕获了局部变量,才能在函数中使用该局部变量

①  [sz] (const string& str) {return str.size() > sz} 捕获sz,正确

②  [   ]  (const string& str) {return str.size() > sz} 未捕获sz,错误

③  捕获列表只适用于局部非静态变量,表达式可以使用局部静态变量,以及所在函数之外的

      变量

3)值捕获、引用捕获

4)   [this]{x += 1}:捕获列表中的this,加了this可以使用类对象中的成员变量

3)指定返回类型

二 std::bind()

1. 用法

在某些情况下,使用lambda与使用函数有相同的效果;

但是,对于find_if( )这种只能接受一元谓词的函数,使用接受两个参数的函数,来设置条件,就无法正常使用了;

如何解决将接受两个参数的函数转变为接受一个参数的函数

2. std::bind()

std::bind( )作为一个通用的函数适配器,接受一个可调用对象,并生成一个新的可调用对象
auto newCallbale = std::bind(callable, arg_list)
arg_list:参数列表,用逗号分隔,对应callable的参数;调用newCallable时,newCallable
               会调用callable,并将arg_list传入callable函数

3. 使用std::bind() 
    std::bind、std::ref、std::cref都定义于functional;

1)bind函数的参数

auto test2 = std::bind(test1, 1, 7, std::placeholders::_1, 2, std::placeholders::_2)
上述两个函数中,test1接受5个参数;test2接受2个参数,test2接收的2个参数,会作为test1的第3、5个参数;

2)对参数重新排序

可以使用bind函数对参数进行重新排序,适用于比较大小的场景,使用bind函数对参数进行重新排序之后,不必在重新写一个函数。

3)绑定引用参数

① 正常情况下,对于非占位参数,bind是以复制的形式传入原来函数中

② 引用用法:

     for_each(words.begin(), words.end(), bind(print, std::ref(os), std::placeholders::_1))

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值