【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()函数
lambda() lambda()语法捕捉列表mutable lambda 底层原理函数对象与lambda表达式 lambda()语法 lambda表达式书写格式: [capture-list] (parameters) mutable -> return-type{ statement }咱…...

ThreeJs CSS3DObject 点击失效问题
想实现一个在选中物体,弹出菜单,结果发现,点击会失效 <ul id"menu" class"list-group list-group-full"><li class"list-group-item" onclick"test()">24小时曲线</li><li cla…...

飞书深诺、恒生面试(部分)(未完全解析)
飞书深诺 说一下你对SaaS项目的理解?数据隔离是怎么处理的?Answer: 我们采用的是SAAS服务多租户数据隔离架构中的1.3共享数据库,通过租户ID来隔离,成本最低,隔离级别最低。Q:有没有开发隔离的中间件&#x…...

Spring Cloud Config: 了解、原理和使用
Spring Cloud Config: 了解、原理和使用 Spring Cloud Config 是 Spring Cloud 生态系统中的一个重要组件,它提供了一种分布式配置管理的解决方案,能够集中管理应用程序的配置,支持多种后端存储,如 Git、SVN、本地文件系统、Vaul…...

基于图的路径规划算法对比
基于图的路径规划算法对比 算法说明与实现效果构造路网1.打开Arcmap2.新建Shapefile文件3.编辑Shapefile属性4.开始编辑5.创建要素并绘制路网6.打断相交线7.保存编辑8.打开图层属性表9.添加字段10.完成字段添加11.计算字段id12.计算点线字段13.选中length字段14.计算length字段…...

SQL Server 索引
1、索引的概念 假设数据库中现在有2万条记录,现在要执行这样一个查询:SELECT * FROM table where num10000。如果没有索引,必须遍历整个表,直到num等于10000的这一行被找到为止;如果在num列上创建索引,SQL …...

java抽奖
目录 一、简要描述 二、代码 一、简要描述 此抽奖方式为:在1~30个数字之间 挑选7个不重复的数字输入,系统会根据中奖的号码与用户输入的号码进行比较,系统会输出是否中奖的提示! 二、代码 import java.util.Scanner; import ja…...

【springboot+云计算】B/S医院信息管理系统源码(云HIS)
一、基于云计算技术的B/S架构的医院管理系统(简称云HIS) 采用前后端分离架构,前端由Angular框架、JavaScript语言开发;后端使用Java语言开发。系统遵循服务化、模块化原则开发,具有强大的可扩展性,二次开发方便快捷。为医疗机构提…...

go 读写 excel 读取 txt 繁体中文转码
读取txt,繁体中文转码 package mainimport ("bufio""fmt""golang.org/x/text/encoding/traditionalchinese""os" )func readTxtTest() {txtPath : C:\Users\admin\Desktop\contact.txtfile, err : os.Open(txtPath)if err…...

docker网卡的IP地址修改
1. 安装docker 请参考 Linux系统在线安装docker任意版本完整教程 2. dockers启动一个容器查看容器ip docker run -d --name nginx -p 80:80 nginx #启动一个容器 docker ps -a #查看容器正常运行 docker inspect --format {{ .NetworkSettings.IPAddress }} nginx ##查看…...

python与深度学习——基础环境搭建
一、安装jupyter notebook Jupyter Notebook是一个开源的交互式笔记本环境,可以用于编写和执行代码、创建可视化效果、展示数据分析结果等。我们在这里用它实现代码运行和观察运行结果。安装jupyter notebook实质上是安装Anaconda,后续还要在Anaconda Prompt中使用c…...

Django实现简单的音乐播放器 2
在《Django实现简单的音乐播放器 1》前期准备的基础上开始开发。 效果: 目录 项目视图 创建视图方法 路由加载视图 加载模板 创建首页html文件 加载静态资源文件 加载静态文件 使用方法 启动服务器 加载数据表 创建表模型 生成表迁移 执行创建表 插入…...

OpenCV 入门教程:图像读取和显示
OpenCV 入门教程:图像读取和显示 导语一、图像读取1.1、导入 OpenCV 库1.2、读取图像文件1.3、图像读取的返回值 二、图像显示2.1、创建窗口2.2、图像显示2.3、等待按键2.4、关闭窗口 三、示例应用总结 导语 在计算机视觉和图像处理领域,读取和显示图像…...

什么是GPT?
文章目录 1、什么是GPT?2、gpt版本时间线3、我们能用GPT做什么?4、如何快速体验GPT?5、作为一名开发者,如何在代码中使用GPT?6、如何在现有项目中使用和部署GPT?7、GPT的优缺点?8、对于人工智能…...

如何通过浏览器配置哪些网页不走代理服务器,Lantern开启后部分网页打不开了
浏览器点设置 > 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器” 搜索“代理” > “打开计算机的代理设置” > 编辑“使用代理服务器”,将不用代理的url链接域名写进来,点击保存。然后刷新打不开的网页,…...

Redis常见面试题
什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么 把redis内存中的数据持久化到磁盘的过程就是redis持久化。RDB:快照存储,每隔一段时间对redis内存中的数据进程快照存储。优点:恢复数据快 缺点:数据完整性差 AOF:日志追加 把每个写…...

应用零信任原则:案例研究和现场经验教训
随着云架构、软件即服务和分布式劳动力日益成为当今现代组织的主导现实,零信任安全模型已成为首选安全范例。 因此,描述零信任安全原则以及构成零信任架构 (ZTA) 的组件的出版物和资源数量几乎令人瘫痪。该行业缺乏的是一个多样化的示例库,可…...

RabbitMQ系列(14)--Topics交换机的简介与实现
1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去,不同于Direct交换机的是,Topics能把一个消息往多个不同的队列发送;Topics交换机的routingkey不能随意写,必须是一个单词列表,并以…...

解决PyInstaller打包selenium脚本时弹出driver终端窗口
解决PyInstaller打包selenium脚本时弹出driver终端窗口 找到service.py C:\Users\XXX\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\common\service.py添加creationflags 在第77行添加: creationflags134217728使用PyInstaller打包 pyinstaller -F -w -…...

基于卷积神经网络VGG的猫狗识别
!有需要本项目的实验源码的可以私信博主! 摘要:随着大数据时代的到来,深度学习、数据挖掘、图像处理等已经成为了一个热门研究方向。深度学习是一个复杂的机器学习算法,在语音和图像识别方面取得的效果,远远…...

mysql查询语句练习总结(涵盖所有sql语法)
最近在学习SQL嘛,所以各个地方找题目来练手,毕竟现在能离得开数据库么? Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 问题: 1、查询“001”课程比“002”课程成绩高的所有学生的学号&#x…...

TypeScript 中 any、unknown、never 和 void 有什么区别?
一 unknown: 未知类型 unknown: 未知类型是typescript 3.0 中引入的新类型。 1.1 所有类型的字面量都可以分配给unknown类型 unknown未知类型,代表变量类型未知,也就是可能为任意类型,所以, 所有类型的字面量都可以分配给unkno…...

算法Day60 | 84.柱状图中最大的矩形,刷题总结
Day60 84.柱状图中最大的矩形刷题总结 84.柱状图中最大的矩形 题目链接:84.柱状图中最大的矩形 遍历每个元素,找到左右元素小于当前元素的,以左右元素间的区间(左开右开区间)所围成的面积中的最大值。 数组尾部加一个…...

python实现pdf转换为word文档,尽量保持格式不变
from pdf2docx import Converterdef convert_pdf_to_word(pdf_path, docx_path, font_path):# 创建 pdf2docx.Converter 对象,用于进行 PDF 到 Word 文档的转换操作。cv Converter(pdf_path)# 设置系统默认字体文件的路径cv.font_path font_path# docx_path 转换…...

TCP / IP 网际层的 4 个重要协议
TCP / IP 网际层的 4 个重要协议 TCP/IP(Transmission Control Protocol/Internet Protocol)是一组用于互联网通信的协议。其中,网际层(Internet Layer)是TCP/IP协议栈中的一个关键层,主要负责网络间的数据…...

MySQL阶段DAY20(附笔记)
【注意】:工厂模式学习知识结构如下: (一)、单例模式 1.Single类: 使用懒汉式:对象的延迟加载,安全的,高效的应用 双重判断提升效率和安全性 package singleton;/** 单例设计模式之…...

考场作弊行为自动抓拍告警算法 yolov7
考场作弊行为自动抓拍告警系统通过yolov7python网络模型算法,考场作弊行为自动抓拍告警算法实时监测考场内所有考生的行为,对考生的行为进行自动抓拍,并分析判断是否存在作弊行为。YOLOv7 的发展方向与当前主流的实时目标检测器不同ÿ…...

在Linux中安装RabbitMQ
RabbitMQ下载网址 Socat下载网址 erlang下载网址 RabbitMQ安装包依赖于Erlang语言包的支持,所以需要先安装Erlang语言包,再安装RabbitMQ安装包 通过Xftp软件将这三个压缩包上传到linux中的opt目录下 ,双击即可 在安装之前先查询…...

electron 单个实例控制以及日志输出
electron 单个实例控制 在使用electron打包的应用程序的时候,点击应用图标会打开多个实例,要想控制单个实例,需要通过 app.requestSingleInstanceLock() 判断当前程序的实例是否为当前取得锁, 或者说, 当前实例是否为…...

基于matlab使用AprilTag标记进行相机校准(附源码)
一、前言 AprilTags被广泛用作物体检测、定位应用的视觉标记,并作为相机校准的目标。AprilTags类似于QR码,但旨在编码更少的数据,因此可以更快地解码,这对于实时机器人应用程序非常有用。使用 AprilTags 作为校准模式的优点包括更…...