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(); //无返回值
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

osg::DrawElements*系列函数及GL_QUAD_STRIP、GL_QUADS绘制四边形效率对比

目录 1. 前言 2. osg::DrawElements*系列函数用法说明 3. GL_QUADS、GL_QUAD_STRIP用法及不同点 4. 效率对比 5. 总结 6. 参考资料 1. 前言 利用osg绘制图元&#xff0c;如&#xff1a;三角形、四边形等&#xff0c;一般用osg::PrimitiveSet类。其派生出了很多子类&#…

Ps:三角形工具

三角形工具 Triangle Tool可以绘制三角形形状&#xff08;矢量形状&#xff0c;或者是基于像素的形状&#xff09;和路径&#xff08;形状轮廓&#xff09;。 快捷键&#xff1a;U ◆ ◆ ◆ 常用操作方法与技巧 1、一般使用拖拽的方式绘制三角形。也可直接在画布上点击&#…

DFA 算法实现敏感词过滤

背景 项目中APP端发帖&#xff0c;评论可能包含多个关键词&#xff0c;铭感词。此时需要对该内容进行过滤处理。此前都是在客户端层面操作&#xff0c;这样不仅带来了性能的损耗&#xff0c;而且新增铭感词时&#xff0c;需要客户端重新打包上架&#xff0c;显得十分不合理。所…

树莓派eMMC扩容分区

1. Raspbian系统&#xff08;树莓派官方系统&#xff09; 使用命令 raspi-config选择 Advanced Options 选择 Expand Filesystem 重启即可扩容成功。 2. 非树莓派官方系统 查看硬盘列表及分区信息 [rootlocalhost install]# lsblk NAME MAJ:MIN RM SIZE RO TYPE…

14 2023.12.31 --------release--------misc--------

呵呵 一部分 misc 存在草稿箱好久了 而且 也并没有那么重要, 直接放出去吧 今年的 专业技能方面的收获主要是一些方面 linux 方面, 这部分内容主要是集中在上半年 90 telnet 连接上对方服务之后 立即 “Connection closed by foreign host.“ 89 重写 /proc/sys/vm/nr_pd…

HarmonyOS4.0系统性深入开发07创建一个ArkTS卡片

创建一个ArkTS卡片 在已有的应用工程中&#xff0c;创建ArkTS卡片&#xff0c;具体操作方式如下。 创建卡片。 根据实际业务场景&#xff0c;选择一个卡片模板。 在选择卡片的开发语言类型&#xff08;Language&#xff09;时&#xff0c;选择ArkTS选项&#xff0c;然后单…

【AIGC-图片生成视频系列-4】DreamTuner:单张图像足以进行主题驱动生成

目录 一. 项目概述 问题&#xff1a; 解决&#xff1a; 二. 方法详解 a) 整体结构 b) 自主题注意力 三. 文本控制的动漫角色驱动图像生成的结果 四. 文本控制的自然图像驱动图像生成的结果 五. 姿势控制角色驱动图像生成的结果 2023年的最后一天&#xff0c;发个文记录…

vmware部署docker+springboot+MySQL(超详细)

一、前期准备 (一)安装jdk #docker search openjdk #docker pull openjdk:8 (二)确认网络 如果局域网其他终端(如手机访问),虚拟机网络连接需要选择《桥接》模式,而且,需要使用有线连接,不能使用Wi-Fi,切忌切忌! 并且要选择实际的那个有线连接。比如我这里是“R…

解算人生--写于2023跨年之夜

最近买了一本书&#xff0c;书名叫《计算》 读了部分内容&#xff0c;虽然理解上还需要再下下功夫&#xff0c;但是直观的感觉冲击还是挺大的&#xff0c;最明显的就是表面与本质的把握。大家可能都有这样一种感觉&#xff0c;初步涉足某一领域时&#xff0c;开始我们都会被大量…

读书笔记1-C++ Primer Plus

C是在C语言基础上开发的一种集面向对象编程&#xff08;OOP&#xff09;、通用编程和传统的过程化编程于一体的编程语言。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了C的基本概念和技术。 全书分17章和10个附录&#xff0c;分…

异常检测 | Matlab基于GNN图神经网络的数据异常数据检测

异常检测 | Matlab基于GNN图神经网络的数据异常数据检测 目录 异常检测 | Matlab基于GNN图神经网络的数据异常数据检测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 Matlab基于GNN图神经网络的数据异常数据检测。其核心思想是学习一个函数映射。本次使用人类活…

抖音详情API:从零开始构建抖音应用

随着短视频的兴起&#xff0c;抖音已经成为了一个全球范围内的热门平台。对于开发人员而言&#xff0c;利用抖音详情API从零开始构建抖音应用具有巨大的潜力和机会。本文将为你提供从零开始构建抖音应用的指南&#xff0c;包括开发环境搭建、API请求格式、用户认证等关键环节&a…