effective c++ 第六章 lamda表达式

lamda表达式-lamda-改变了c++语言游戏。这有点让人吃惊,毕竟它并未给这门语言带来新的令人印象深刻的表现力。lamda可以做的任何事情,你都可以用手多敲一些代码来完成。然而lamda在创建函数对象上的便捷性,一天又一天的对c++编程产生了巨大的影响。没有lamda时,使用c++的_if算法(std::find_if,std::remove_if,std::count_if)会很琐碎。而引入lamda之后,琐碎不复存在了。用户化的比较算法也类似(std::sort,std::lower_bound, std::nth_element)。在stl之外,lamda使得用户可以方便的为std::unique_ptr和std::shared_ptr自定义对象删除器。也使得多线程编程中,对条件变量的判断显得更为直接。除了标准库之外,lamda简化了回调函数,接口适配函数以及一次性的上下文函数调用。lamda使c++成为一门令人愉悦的语言。

   lamda的词义会让你困惑,下面例子帮你简单理一理:

             std::find_if(container.begin(),container.end(), [] (int val){return 0 <val && val < 10;});

闭包是lamda在运行时候创建的对象。根据捕获模式不同,闭包持有捕获数据的拷贝或者引用。

当调用std::findf时候,闭包是传递给函数的第三个参数。

闭包类是闭包实例化的类。每个lamda都促使编译器产生一个闭包类。而lamda的代码,将在其闭包类的成员函数中运行。

lamda创建的闭包,经常被用作函数对象参数。在上面std::find_if中正是如此。

然而闭包本身可以被复制,可能会出现一个闭包类型的多个闭包。下面代码:

{

   int   x; //局部变量

  auto c1 = [x](int y) { return x*y > 55;};  c1是landa产生的闭包的一个拷贝

  auto c2 = c1;          // c2是c1的一个拷贝

  auto c3 = c2;          // c3 是c2的一个拷贝

}

c1,c2,c3都是lamda闭包的拷贝。

非正式的情况,不会区分闭包,闭包类以及landa。但在下面条款中,区分哪些在编译期间存在(lamda和闭包类),以及哪些在运行期间存在(闭包对象),并且弄清楚它们之间的联系是非常重要的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值