C++ :lambda表达式

目录

lambda表达式书写格式:

lambda表达式各部分说明:

lambda的使用示范:

注意事项:

返回值类型可以省略,参数也可也省略:

sort内部也可以直接写lambda表达式:

排序时利用lambda进行排序:

lambda的类型:

[捕捉列表的使用方式 和 mutable为什么省略 ?](#捕捉列表的使用方式 和 mutable为什么省略 ?)

lambda的特殊使用方式:

混合捕捉:


lambda表达式书写格式:

复制代码
[capture-list] (parameters) mutable -> return-type { statement }

lambda表达式各部分说明:

  • capture-list\] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据\[\]来 判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda 函数使用。

  • mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量 性。使用该修饰符时,参数列表不可省略(即使参数为空)。
  • ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回 值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推 导。
  • {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获 到的变量。

注意:在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为 空。因此C++11中最简单的lambda函数为:[]{}; 该lambda函数不能做任何事情。

根据lambda的表达式,可以看出 lambda的本质是一个匿名函数,其次捕捉列表虽然可以为空,但是不能被省略,而mutable在默认的情况下可以省略,只有在特殊的情况下才进行使用

lambda的使用示范:

注意事项:

返回值类型可以省略,参数也可也省略:

返回值在明确的时候可以省略!因为编译器它会自动推导!同样参数也可以省略!前提是没有参数!

sort内部也可以直接写lambda表达式:
排序时利用lambda进行排序:

lambda的类型:

每一个lambda表达式都是不一样的,可以看到下图中的lambda后面跟随着的一串数字乱码都是不固定的。

其次,lambda的本质是一个仿函数,是因为lambda的底层或是说它的内部会更具lambda的内容生成对应的仿函数,不过是类似于仿函数,因为调用lambda本质上是调用operator()

捕捉列表的使用方式 和 mutable为什么省略 ?

如上图所示,捕捉列表[]内部并没有任何的参数,反而是参数列表中进行了传址调用,这里使得lambda是变成了一个匿名函数,而如果想只捕捉变量 a 和 b 则需要将ab放入捕捉列表中,参数列表变为空即可,但是把a和b放入捕捉列表又会出现一些小问题:

因为捕捉的变量是拷贝,而不是直接进行传址拷贝的,而是传值拷贝的,同时捕获的变量是被const修饰的,也就是捕获列表的a,b是不可修改的,所以这里就需要mutable

但是还是没有什么意义,应为把捕获的a,b变得可以修改数值,但是捕获的a,b和外面变量a,b不是同一个a,b,所以没有意义,因为捕获列表的捕获是传值拷贝,不是传址拷贝,所以这样使用mutable和这样写法的捕获列表是无效的,没有意义的。

如果想要同时修改外面的变量,可以使用&进行引用捕获:

但是&是引用和取地址在这里会出问题,容易弄混,这下面是引用方式捕捉:

同时也可以使用传指针的方式进行交换来改变外面的变量

lambda的特殊使用方式:

=\]传值捕捉所有,\[\&\]传引用捕捉所有,前者是传值调用,捕获所有变量的数值,后者是引用调用,捕获所有的变量并且进行引用 ![](https://img-blog.csdnimg.cn/direct/9bd7810ea84d4f1cba6c97689892198d.png) #### 混合捕捉: ![](https://img-blog.csdnimg.cn/direct/590e7be7e01c48f187b3eb890e42358a.png) *** ** * ** ***

相关推荐
枯萎穿心攻击19 分钟前
响应式编程入门教程第二节:构建 ObservableProperty<T> — 封装 ReactiveProperty 的高级用法
开发语言·unity·c#·游戏引擎
Eiceblue2 小时前
【免费.NET方案】CSV到PDF与DataTable的快速转换
开发语言·pdf·c#·.net
tan180°2 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
m0_555762902 小时前
Matlab 频谱分析 (Spectral Analysis)
开发语言·matlab
浪裡遊3 小时前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
彭祥.4 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk4 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
好开心啊没烦恼4 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
简佐义的博客5 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang