【lambda函数】lambda()函数
lambda()
- lambda()语法
- 捕捉列表
- mutable
- lambda 底层原理
- 函数对象与lambda表达式
lambda()语法
lambda表达式书写格式:
[capture-list] (parameters) mutable -> return-type{ statement
}
咱们一个个来解释:
[capture-list]
:捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据 [] 来判断接下来的代码是否为lambda
函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。不能省略。
(parameters)
: 参数列表,与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
mutable
: 默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
-> return-type
:返回值类型,用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
statement
:函数体,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。不可省略。
因此,把可以省略的都省略掉,最那简单的lambda
函数是 []{}
,该 lambda 表达式没有任何意义。该lambda函数不能做任何事情。
接下来写一个lambda函数:
auto add = [](int x, int y)->int{return x + y;};
lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。
调用:
//第一种add(10, 20);//第二种[](int x, int y)->int {return x + y;}(10, 20);
可以看出,lambda函数和普通函数在组成和调用上都很相似。参数列表,返回值,函数体都不在多叙述。
捕捉列表
捕捉列表描述了上下文中那些数据可以被lambda使用。
如:
int a = 10;int b = 20;auto add = [a,b]() {return a + b ;};
直接捕捉了 a b 变量,且是传值捕捉,lambda函数体内的a, b变量,只是外边 a b 的一份拷贝。且默认无法修改。
要想修改,可以使用 mutable 进行修饰。
mutable
如:
auto add = [a, b]() mutable{a = 20;return a + b;};
就不会报错,但因为是传值,所以lambda
函数内部 a的变化,无法影响外部的a变量。
mutable 用的比较少。
当然,lambda函数
和普通函数一样,捕捉列表,可以传值捕捉,也可以传引用捕捉。
int x = 10;int y = 20;//捕捉列表//传引用 参数列表auto fun1 = [](int& x, int& y) {int tmp = x;x = y;y = x;};// 传引用捕捉 auto fun2 = [&x,&y]() {int tmp = x;x = y;y = x;};//对上下文所有变量进行传引用捕捉auto fun3 = [&]() {x = y;};//对除y以外的所有变量传引用捕捉,y传值捕捉auto fun4 = [&, y] {;};//对y进行传值捕捉,对其余变量进行传引用捕捉auto fun5 = [=, &y] {;};
lambda 底层原理
看如下代码:
int main()
{int a = 10;int b = 20;auto add = [a, b]() mutable{a = 20;return a + b;};cout << typeid(add).name() << endl;cout << sizeof(add) << endl;return 0;
}
lambda 函数的类型变量是什么呢?
lambda 类型的大小又是多少呢?
从运行结果上来看,其大小为一,类型大致为一个类,具体是什么我们现在也不清楚。
函数对象与lambda表达式
函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。
//仿函数
class math {public:int operator() (int x, int y){return x + y;}
};int main()
{int a = 10;int b = 20;//仿函数对象math m;//lambda函数auto add = [](int a,int b) {return a + b;};m(a, b);add(a, b);return 0;
}
我们从反汇编上来看,
仿函数底层代码,调用了 重载的 ()
lambda()
函数的底层:
我们也可以看出,也是调用了一个lambda 类里的重载的()
,
不妨看出,lambda()函数的底层就是一个重载了()
的空类。
所以就可以知道,lambda类型的大小为1了:
因为,它的底层是一个空类,是一个仿函数。
至于它的类型,如图:
也就是,上图是 lambda_UUID
UUID
是 通用唯一识别码(Universally Unique Identifier)的缩写,是通过一种特殊的算法计算出来的具有唯一识别信息的 数据。
也就是说,每一个lambda()
对象的类型都不一样。
也就不存在不同lambda()对象相互赋值的情况。
结语
本次的博客就到这了。
我是Tom-猫,
如果觉得有帮助的话,记得
一键三连哦ヾ(≧▽≦*)o。
咱们下期再见。
【lambda函数】lambda()函数相关推荐
- Java箭头函数,lambda函数
Java箭头函数,lambda函数 lambda表达式实质就是一种语法糖,(建议尽量不要使用lambda表达式,代码太简洁,难懂,难以调试) lambda表达式的简单例子: 不需要参数,返回5 ()- ...
- 高阶函数-lambda表达式
#2.6 map()# 第一个参数传入一个函数,,第二个参数为一个可迭代对象li_1 = (1,3,5,7)def funcA(x): return x*xm1 = map(funcA,li_1)pr ...
- python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)
python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...
- C++11新特性中的匿名函数Lambda表达式的汇编实现分析(二)
2019独角兽企业重金招聘Python工程师标准>>> C++11新特性中的匿名函数Lambda表达式的汇编实现分析(一) 首先,让我们来看看以&方式进行变量捕获,同样没有参 ...
- 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计
目录 文章目录 目录 前文列表 函数 Lambda 表达式 函数设计 函数的存储 实现 Lambda 函数 函数的运行环境 函数调用 可变长的函数参数 源代码 前文列表 <用 C 语言开发一门编 ...
- 《Python数据科学指南》——1.16 使用lambda创造匿名函数
本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.16节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...
- python-匿名函数lambda
python-匿名函数lambda 有些时候,我们在传入函数时,不需要显示的定义函数,直接传入匿名函数更方便.在python中,对匿名函数提供了有限支持.以map()函数为例,计算f() = x2,使 ...
- Java8学习系列之匿名函数Lambda
Lambda介绍 Lambda,别名函数式编程,维基百科给出以下介绍: 函数式编程是一种编程范式.它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据.它是一种声明式的编程范式,通过表达式和声 ...
- Python编程基础:第五十三节 匿名函数Lambda Function
第五十三节 匿名函数Lambda Function 前言 实践 前言 匿名函数是一种非常优雅的表达方式,它可以将函数定义用一行代码进行表示.其书写方式为参数列表:函数实现,其中多个参数之间用逗号隔开, ...
- Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
Python语言学习之lambda:lambda函数的简介.使用方法.案例大全之详细攻略 目录 lambda函数的简介 1.lambda匿名函数的格式 2.lambda函数特点 3.lambda函数与 ...
最新文章
- Google Mock(Gmock)简单使用和源码分析——源码分析
- DPDK KNI实现(二十五)
- nginx php跳转url参数,NGINX 中把url中的内容当初参数处理
- Spring + JDK Timer Scheduler Example--reference
- 你在第几楼?80后、90后扎心图鉴
- 机器学习之贝叶斯垃圾邮件分类
- 实际的Reactor操作–检索Cloud Foundry应用程序的详细信息
- jquery获取radio的值,a标签传值
- dataset__getitem___【小白学PyTorch】3.浅谈Dataset和Dataloader
- 不重复数字(洛谷 P4305)
- springboot controller 分页查询_Spring Boot实战分页查询附近的人: Redis+GeoHash+Lua
- 【没有assembly目录】spark2.0.0启动时无法访问spark-assembly-*.jar的解决办法
- 如何把java控件添加代码_JAVA 添加控件问题 代码如下 很简单的一个程序 在线等 Thanks...
- AndroidSDK和ADT下载地址
- AI智能尺寸测量仪简介(图像尺寸测量仪)
- java生成数字字母组合_java生成随机数字和字母组合
- 云短信使用——阿里云短信使用步骤
- 使用Datadog在docker环境下监控Java, Tomcat, Nginx, Kfaka, ZooKeeper
- glide 加载图片宽度填满,高度自适应图片比列
- DB 查询分析器 方便地创建DB2自定义函数
热门文章
- win7怎么设置路由器连接到服务器未响应,路由器连接不上Win7系统电脑的解决方法...
- 从100套真题中提炼而出的100百个经典句子
- 华为OD机试真题 C++ 实现【删除重复数字后的最大数字】【100%通过率】【2022.11 Q4 新题】
- 银行数字化转型的技术展望
- 不是机器人韩剧所有歌曲_不是机器人主题曲、插曲、片尾曲OST歌曲歌词
- C语言是终极王者,【独家】数竞决赛大比拼,谁才是终极王者?
- 如何关闭联想杀毒Plus
- 自定义View、画波浪线
- 全民小视频视频搬运伪原创
- win10下打开.hlp文件真正简单解决方法?