lambda函数

文章目录

  • 定义
  • 捕捉列表的形式
  • 一些更复杂的捕捉列表组合
  • 代码演示
    • 演示一
    • 演示二
    • 演示三
    • 演示四
    • 演示五
    • 演示六

lambda 函数,是C++11中新引入的函数式编程语法,lambda函数可以被定义在类中成员函数内部,全局函数的内部。它是一个局部函数(即在函数作用域中定义的函数)。
一般都是定义在函数的内部,底层编译器会把lambda函数编译为仿函数。

定义

lambda函数的语法定义如下:

[capture](parameters) mutable ->retrun-type{statement};

[capture]:捕捉列表。捕捉列表总是出现在lambda函数的开始处。事实上,[]是lambda引出符。编译器根据该引出符判断接下来的代码是否是lambda函数。捕捉列表能够捕捉上下文中的变量以供lambda函数使用。

(parameters):参数列表。与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号()一起省略。

mutable: mutable 修饰符。默认情况下。lambda函数总是一个const函数,mutable可以取消其常量性。
在使用该修饰符时,参数列表不可以省略(即使参数为空)。

->retrun-type: 返回类型。用追踪返回类型形式声明函数的返回类型。
出于方便,不需要返回值的时候也可以连同符号->一起省略。此外,在返回类型明确的情况下,
也可以省略该部分,让编译器对返回类型进行推导。例如: ->void ; ->int ; ->bool
->retrun-type 是一个整体要省略时都省略。例如:[]->{} //是错误写法

{statement}: 函数体。内容与普通函数一样,不过除了可以使用参数以外,还可以使用所有捕获的变量。

在极端情况下,C++11中最为简略的lambda函数只需要声明为 []{};但是该lambda函数不能做任何事情。

捕捉列表的形式

语法上 捕捉列表由多个捕捉项组成,并以逗号分割。捕捉列表有如下几个形式:
[var] 表示值传递方式捕捉变量var。这是方式变量var,必须是父作用域内的自动变量,捕捉任何非此作用域或者是非自动变量都会编译报错。
[=] 表示值传递方式捕捉所有父作用域及全局作用域的变量(包括this)。
[&var] 表示引用传递方式捕捉变量var。这是方式变量var,必须是父作用域内的自动变量,捕捉任何非此作用域或者是非自动变量都会编译报错。
[&] 表示引用传递方式捕捉所有父作用域及全局作用域的变量(包括this)。
[this] 表示值传递方式捕捉当前的this指针。

注意:父作用域:这里指的是包含lambda函数的语句块。

一些更复杂的捕捉列表组合

[c,&a,&b]: 表示以引用传递方式捕捉变量a和b,值传递方式捕捉变量c。
[=,&a,&b]: 表示以引用传递方式捕捉变量a和b,值传递方式捕捉其他所有变量。
[&,a,this]: 表示以值传递方式捕捉变量a和this,引用传递方式捕捉其他所有变量。

不过值得注意的是,捕捉列表不允许变量重复传递。否则会导致编译时期报错。
[=,a] 这里=已经以值传递方式捕捉了所有变量,再捕捉a重复。
[&,&this] 这里&已经以引用传递方式捕捉了所有变量,再捕捉this重复。

代码演示

演示一

int main(int argc, char* argvs[])
{	
	int girls = 3, boys = 6;
	
	//定义一个lambda函数
	auto totalChilds = [=]() mutable ->int
	{
		int total = girls + boys;
		cout << __func__ << ": total= " << total << endl;
		return total;
	};
	cout << __func__ << ": totalChilds= " << totalChilds() << endl;
}

注意:这里使用了一个auto关键字推导出了totalChilds变量的类型为匿名lambda函数,后续就可以再父函数内使用totalChilds来调用lambda函数使用了。
在这里插入图片描述
通过__func__ 打印输出可以看到在lambda函数内会被打印处operator()。即仿函数的名称。说明了lambda函数也是一种仿函数。

演示二

int main(int argc, char* argvs[])
{	
	int girls = 3, boys = 6;

	auto totalChilds = [=](int a) mutable ->int
	{
		int total = girls + boys + a;
		cout << __func__ << ": total= " << total << endl;
		return total;
	};
	cout << __func__ << ": totalChilds= " << totalChilds(5) << endl;
}

注意: totalChilds中传递的数值5会被传递给lambda函数的形式参数a。
在这里插入图片描述

演示三

int main(int argc, char* argvs[])
{	
	int girls = 3, boys = 6;

	auto totalChilds = [&]() ->int 
	{
		int total = girls + boys;
		cout << __func__ << ": total= " << total << endl;
		return total;
	};
	cout << __func__ << ": totalChilds= " << totalChilds() << endl;
}

注意: 没加mutable,默认就是const,即不能在lambda内修改传递进来的变量的值。但是这个const关键字不能显示的写出来,否则编译报
错。

演示四

int main(int argc, char* argvs[])
{	
	int girls = 3, boys = 6;

	auto totalChilds = [girls, boys]() ->int
	{
		int total = girls + boys;
		cout << __func__ << ": total= " << total << endl;
		return total;
	};
	cout << __func__ << ": totalChilds= " << totalChilds() << endl;
}

在这里插入图片描述

演示五

int main(int argc, char* argvs[])
{	
	int girls = 3, boys = 6;

	auto totalChilds = [&girls, &boys]() ->int
	{
		int total = girls + boys;
		cout << __func__ << ": total= " << total << endl;
		return total;
	};
	cout << __func__ << ": totalChilds= " << totalChilds() << endl;
}

在这里插入图片描述

演示六

int main(int argc, char* argvs[])
{	
	int girls = 3, boys = 6;

	auto totalChilds = [girls, boys]()
	{
		int total = girls + boys;
		cout << __func__ << ": total= " << total << endl;
		//return total;
	};
	totalChilds(); //无返回值
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/281347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springboot定时执行某个任务

springboot定时执行某个任务 要定时执行的方法加上Schedule注解 括号内跟 cron表达式 “ 30 15 10 * * &#xff1f;” 代表秒 分 时 日 月 周几 启动类上加上EnableScheduling 注释

第二部分 离散型随机变量

目录 求分布律里的未知数 例1 例2 根据X的分布律写Y的分布律 例3 根据(X,Y)的分布律写Z的分布律 例4 根据(X,Y)的分布律写边缘分布律 例5 X与Y相互独立时的联合分布律 例6 根据分布律求期望、方差 例7 求分布律里的未知数 例1 已知X的分布律为 X-202P0.40.3k ,试求k 解 0.40…

【网络奇遇记】揭秘计算机网络的性能指标:时延带宽积|往返时间|利用率|丢包率

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;上期回顾一. 时延带宽积二. 往返时间三. 利用率四. 丢包率&#x1f4dd;结语 &#x1…

【用户增长】引言:浅析游戏运营用户增长概念

1 游戏发行运营中的主要职能&#xff1a; ​ 一、发行运营通识l 运营介绍&#xff1a;职能分工、发行运营流程、职业发展能力及要求l 品类认知&#xff1a;行业品类布局、品类用户画像、运营节奏及特性&#xff0c;包含不同品类核心打法及长线运营思路l 海外运营&#xff1a;海…

linux安装python

文章目录 前言一、下载安装包二、安装1.安装依赖2.解压3.安装4.软链接5.验证 总结 前言 本篇文章介绍linux环境下安装python。 一、下载安装包 下载地址&#xff1a;官方网站 我们以最新的标准版为例 二、安装 1.安装依赖 yum -y install openssl-devel ncurses-devel li…

什么是AI PC,又有哪些产品

最近一段时间&#xff0c;AI PC成为一个流行词。Intel在发布Core Ultra处理器的时候&#xff0c;直接使用了AI PC这个词语&#xff0c;而各大厂商发布相应的笔记本产品时&#xff0c;也使用了AI Ready的宣传词。而在Intel之前&#xff0c;AMD在发布自己的新一代APU的时候&#…

数据结构和算法-B树的插入和删除

文章目录 B树的插入小结B树的删除小结 B树的插入 首先将根节点的关键字个数填满&#xff0c;填满后再分开成树 分开的规则 此时插入90&#xff0c;从根节点依次查找&#xff0c;然后插入到终端节点的关键字中 插入同上&#xff0c;注意此时在终端节点插入要符合终端节点的大…

蓝桥杯嵌入式KEY

1.按键原理图 2.按键GPIO引脚设置成输入&#xff0c;上拉模式 3.设置TIM4时钟源为外部时钟源 PSC为80-1 Period为10000-1 打开NVIC 中断时间为10ms 4.在bsp文件中添加interrupt.c文件 5.按键单击代码 6.长按键 7.按键过程和显示过程

缺少/run/haproxy目录,haproxy服务启动失败

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 问题描述&#xff1a; 搭建haproxy的机器&#xff0c;因出现故障重启了&#xff0c;然后发现haproxy服务出现异常。重新启动hap…

数据库最小函数依赖求法 附相关习题及解析

首先我们给出最小函数依赖的定义 如果函数依赖集F满足下列条件&#xff0c;则称F为最小函数依赖集或最小覆盖。 ① F中的任何一个函数依赖的右部仅含有一个属性&#xff1b; ② F中不存在这样一个函数依赖X→A&#xff0c;使得F与F-{X→A}等价&#xff1b; ③ F中不存在这样一…

【Linux专区】如何配置新服务器 | 添加普通用户到sudoers | 配置vim | git免账号密码pull push

&#x1f49e;&#x1f49e;欢迎来到 Claffic 的博客&#x1f49e;&#x1f49e; &#x1f449; 专栏&#xff1a;《Linux专区》&#x1f448; &#x1f4ac;前言&#xff1a; 时隔131天&#xff0c;你的好友Claffic重新发文了&#xff01;(✿◕‿◕✿) 上期已经带大家白嫖了阿…

Unity坦克大战开发全流程——游戏场景——敌人——移动的敌人

游戏场景——敌人——移动的敌人 制作预制体 将坦克拖拽至场景中进行设置 写代码 让坦克在两点之间不停移动 随机坐标函数 然后在start()中调用即可 坦克要一直盯着玩家 当小于一定距离时&#xff0c;攻击玩家 重写开火逻辑 注意还要将其tag改成Monster&#xff01; 当敌人死…

鲲志说:向我乘风破浪,好事多磨的2023致敬!(感恩有礼,感谢有你)

伴随着2023最后一个工作日的结束&#xff0c;也终于要给一年的工作划上一个结尾了&#xff0c;当然&#xff0c;也要给自己一个交代&#xff0c;给自己一个年度总结 2023年&#xff0c;大的挫折也是有的&#xff0c;但我相信好事多磨&#xff0c;总的来说是事业型的一年&#x…

前端--基础 目录文件夹和根目录 VScode打开目录文件夹

目录 目录文件夹和根目录 &#xff1a; 目录文件夹 &#xff1a; 根目录 &#xff1a; VScode 打开目录文件夹 &#xff1a; VScode 打开文件夹 &#xff1a; 拖拽目录文件夹 &#xff1a; 目录文件夹和根目录 &#xff1a; 我们都清楚&#xff0c;在实际的工作中会…

考研后SpringBoot复习1

考研后SpringBoot复习 Hello World入门 复习的版本为SpringBoot2的版本 创建maven项目 在pom文件中导入SpringBoot的依赖同时引入web开发的启动器 <!--声明springboot父项目--><parent><groupId>org.springframework.boot</groupId><artifactId>…

Markdown之EBNF语法介绍(二十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C语言实验3:函数的定义

目录 一、实验要求 二、实验原理 1.函数头 2.函数体 3.函数的定义及使用 三、实验内容 1. sum函数 代码 截图 分析 2. sum函数 代码 截图 分析 3. rank_grade函数 代码 截图 分析 4. rank_grade函数 代码 截图 分析 5. 函数的嵌套使用 代码 截图 分析…

vue中怎么缓存当前组件?缓存后怎么更新?今天来说说keep-alive的理解

&#xff08;看完点个关注呗&#xff0c;持续更新&#xff09; 一、Keep-alive 是什么 keep-alive是vue中的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM keep-alive 包裹动态组件时&#xff0c;会缓存不活动的组件实例&#xff0c…

Pycharm2023版本:Python远程调试配置详解

工欲善其事&#xff0c;必先利其器 首先你需要选择一个专业版本的pycharm&#xff0c;社区版本不支持远程配置功能&#xff0c;专业版下载地址&#xff1a;Pycharm 2023 双击程序进行安装&#xff0c;30天内免费试用&#xff0c;如果想要永久使用&#xff0c;办法你懂的&…

Java强软弱虚引用

面试&#xff1a; 1.强引用&#xff0c;软引用&#xff0c;弱引用&#xff0c;虚引用分别是什么&#xff1f; 2.软引用和弱引用适用的场景&#xff1f; 3.你知道弱引用的话&#xff0c;能谈谈WeakHashMap吗&#xff1f; 目录 一、Java引用 1、强引用&#xff08;默认支持模式…