C++11—lambda表达式

在这里插入图片描述
[]{}是一个类型;[]{}()就可以调用,相当于临时对象;多数会写成最后一种形式,赋予一个名称auto I=[]{};I();

lambda语法

在这里插入图片描述

[]导入符号,mutuable是否可以被改写参数,throwSpec丢出异常,->retType表示返回类型;紫框可写可不写,但是如果写一个就必须要写();{}是函数本体;()里放函数参数;[]取用外部的变量;

(2)左侧相当于右侧建立一个仿函数类,重载();
在这里插入图片描述

  • 绿色框还没做事情,只是一个定义,真正调用执行是f();注意输出为012,因为在定义时,相当于右侧的仿函数类,有自己的一个数据id,创建的时候看到了上面的id=0;自己的id=0;++id变得是自己的id数据,不会影响外界的id;
  • Lambda的类型是一个不知名的仿函数;
  • 因为[id]而不是[&id],因此外界id不会变;
  • mutable表示id可以改变,没有Mutable的话,就不能改变id;与仿函数还是又一点点不完全等价;

lambda用法比较

在这里插入图片描述

  • 第一个如上,第二个[&id]传入引用,外界会影响,操作也会影响外界;第三个,没有mutable就不允许改变[]中参数id,编译器会报错;
  • Lambda是一个仿函数,也可以在函数主题中定义变量,返回数值

lambda举例

在这里插入图片描述

Lambda与decltype

在这里插入图片描述

(1)decltype用作获取Lmabda的类型;
(2)上面一段话的意思就是,lambda就一个无名的仿函数,但是每个都是独一无二的,因此,如果要声明这个类型就使用template或者auto,如果需要类型就使用decltype,例如当你需要使用lambda作为一个hash function或者排序准则传给不定序容器,具体例子代码如图所示;
(3)左侧是set<>coll(cmp);构造函数如箭头所指,
(4)下面一段话:在使用decltype获取lambda类型作为容器类型时,需要同时传入lambda作为构造函数参数,不然容器set会选择调用lambda的默认构造函数和默认赋值操作,但是lambda并没有默认构造,编译器就会报错;因此需要set<>coll(cmp);传入lambda的cmp;

lambda与functor仿函数的对比

在这里插入图片描述
左侧lambda就相当于一个inline内联函数,效率会比右侧仿函数更高;但是这点效率略显微不足道;

lambda在标准库中的应用

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值