C++程序设计——lambda表达式

news2024/11/25 20:33:02

一、问题引入

        在C++98中,如果想对一个数据集合中的元素进行排序,可以使用sort()方法,但如果待排序元素为自定义类型,就需要用户自己定义排序时的比较规则。

        随着C++语法的发展,人们开始觉得其编写比较复杂,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较的逻辑不一样,还需要实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。

        因此,C++11中出现了lambda表达式。

二、lambda表达式语法

1.书写格式

2.表达式各部分说明

(1)[capture-list]:捕捉列表

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

(2)(parameters):参数列表

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

(3)mutable

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

(4)->return-type:返回值类型

        用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可以省略,由编译器对返回值类型进行推导。

(5){statement}:函数体

        在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

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

        可以看出,lambda表达式实际上可以理解为一个匿名函数,且该函数无法直接被调用,但可以借助auto将其赋值给一个变量,那么就可以通过该变量像函数一样进行调用。

3.捕获列表

捕获列表描述了上下文中那些数据可以被lambda使用,以及使用的方式是传值还是传引用:

(1)[var]:表示值传递方式捕捉变量var;

(2)[=]:表示值传递方式捕获所有父作用域中的变量(包括this);

(3)[&var]:表示引用传递方式捕捉变量var;

(4)[&]:表示引用传递方式捕获所有父作用域中的变量(包括this);

(5)[this]:表示值传递方式捕捉当前的this指针。

注意:

(1)父作用域:指包含lambda函数的语句块;

(2)语法上,捕获列表可以由多个捕捉项组成,并以逗号隔开

        例如:[=, &a, &b]表示以值传递方式捕获所有变量,以引用传递方式捕获变量a,b。

(3)捕获列表不允许变量重复传递,否则会导致编译错误

        例如:[=,a]其中=以及以值传递方式捕获了所有变量,再捕捉a则重复捕捉了。

(4)在块作用域以外的lambda函数捕获列表必须为空;

(5)在块作用域中的lambda函数仅能捕捉父作用域中的局部变量,捕捉任何非此作用域或非局部变量都会导致编译报错。

(6)lambda表达式之间不能互相赋值,即使看起来类型相同。

三、函数对象与lambda表达式

1.函数对象(仿函数)

        函数对象,又称为仿函数,即可以像函数一样使用的对象,其原理就是在类中重载了operator()运算符的类对象,使其拥有了类似于函数的动作。

2.lambda表达式

        从使用方式上来看,lambda表达式与函数对象完全一样。实际在底层编译器对lambda表达式的处理方式,就是按照函数对象的方式进行处理的。

即:定义了一个lambda表达式,则编译器会自动生成一个对应的类,并在该类中重载了operator()。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Word2vec原理+实战学习笔记(一)

来源:投稿 作者:阿克西 编辑:学姐 视频链接:https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6 文章标题: Efficient Estimation of Word Representations in Vector Space 基于向量空间中词表示的有效估计…

【计算机网络】学习笔记:第四章 网络层(七千字详细配图)【王道考研】

基于本人观看学习b站王道计算机网络课程所做的笔记&#xff0c;不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系&#xff0c;立删 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;如有疑问欢迎…

安装chatglm

地址 下载源代码 下载完成后解压 安装cuda 输入nvcc -V查看是否安装cuda 输入nvidia-smi查看支持的最高版本&#xff0c;最高支持12.1 下载cudahttps://developer.nvidia.com/cuda-downloads 双击安装 同意之后点击下一步 选择精简模式即可 等待下载安装包 …

链接sqlite

一.sqlite库函数 1.sqlite3_open()函数 语法&#xff1a;*sqlite3_open(const char *filename, sqlite3 *ppDb) 作用&#xff1a;该例程打开一个指向 SQLite 数据库文件的连接&#xff0c;返回一个用于其他 SQLite 程序的数据库连接对象。 参数1&#xff1a;如果 filename …

如何在自己的Maven工程上搭建Mybatis框架?

编译软件&#xff1a;IntelliJ IDEA 2019.2.4 x64 操作系统&#xff1a;win10 x64 位 家庭版 Maven版本&#xff1a;apache-maven-3.6.3 Mybatis版本&#xff1a;3.5.6 目录 前言 一. 什么是Mybatis框架&#xff1f;1.1 框架是什么&#xff1f;1.2 什么是MyBatis &#xff1f;1…

3.11 C结构体及结构体数组

结构体的意义 问题&#xff1a;学籍管理需要每个学生的下列数据&#xff1a;学号、姓名、性别、年龄、分数&#xff0c;请用C语言程序存储并处理一组学生的学籍。 思考&#xff1a;如果有多个学生&#xff0c;该怎么定义 已学数据类型无法解决。 结构体概述 正式&#xff1a;…

【Sping学习详解】

重新学习Spring很久了&#xff0c;也看了不少的视频&#xff0c;但是没有系统总结&#xff0c;容易忘记&#xff0c;网上寻找相关博客&#xff0c;也没有找到按照路线总结的&#xff0c;只能说不顺我心&#xff0c;所以自己总结一下&#xff01;&#xff01;&#xff01; 从下…

vulnhub靶机dpwwn1

准备工作 下载连接&#xff1a;https://download.vulnhub.com/dpwwn/dpwwn-01.zip 网络环境&#xff1a;DHCP、NAT 下载完后解压&#xff0c;然后用VMware打开dpwwn-01.vmx文件即可导入虚拟机 信息收集 主机发现 端口发现 继续查看端口服务信息 打开网站发现只有Apache默认…

【Spring篇】IOC/DI注解开发

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean 2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖…

行为识别 Activity Recognition

行为识别 行为检测是一个广泛的研究领域&#xff0c;其应用包括安防监控、健康医疗、娱乐等。 课程大纲 导论 图卷积在行为识别中的应用&#xff1a;论文研读&#xff0c;代码解读&#xff0c;实验 Topdown关键点检测中的hrnet&#xff1a;论文研读&#xff0c;代码解读&a…

ETL工具 - Kettle 流程、应用算子介绍

一、Kettle 流程和应用算子 上篇文章对Kettle 转换算子进行了介绍&#xff0c;本篇文章继续对Kettle 的流程和应用算子进行讲解。 下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 转换算子介绍 流程算子主要用来控制数据流程和数据流向&#xff1a; 应用算子则是Kettle给…

ESP32 ESP-Rainmaker 本地点灯控制Demo测试

基于ESP-Rainmaker 本地点灯控制Demo测试 &#x1f33f;ESP-Rainmaker项目地址&#xff1a;https://github.com/espressif/esp-rainmaker/tree/master ✨这个项目早些时候就已经开始测试了&#xff0c;最后卡在了手机APP连接esp32设备端一直无法连接上&#xff0c;也一直没有找…

性能:Intel Xeon(Ice Lake) Platinum 8369B阿里云CPU处理器

阿里云服务器CPU处理器Intel Xeon(Ice Lake) Platinum 8369B&#xff0c;基频2.7 GHz&#xff0c;全核睿频3.5 GHz&#xff0c;计算性能稳定。目前阿里云第七代云服务器ECS计算型c7、ECS通用型g7、内存型r7等规格均采用该款CPU。 Intel Xeon(Ice Lake) Platinum 8369B Intel …

Linux第五章

文章目录 前言一、MySQL5.7版本在CentOS系统安装二、Tomcat安装部署1.安装JDK环境2. 解压并安装Tomcat 三、Nginx安装部署四、RabbitMQ安装部署五、Redis安装部署六、ElasticSearch安装部署七、集群化环境前置准备八、Zookeeper集群安装部署九、Kafka集群安装部署十、大数据集群…

操作系统的进程调度

进程调度概述 一、操作系统的调度时机 1、什么时候进行进程调度&#xff1f; 主动放弃&#xff08;进程正常终止、运行过程中发生异常而终止、进程主动请求阻塞&#xff09; 被动放弃&#xff08;分给进程的时间片用完、有更紧急的事需要处理、有更高优先级的进程进入就绪队列…

CentOS7 安装MySQL8

CentOS7 安装MySQL8 安装 VMware 以及 CentOS更新系统添加 MySQL Yum 存储库安装 MySQL 8启动 MySQL检查 MySQL 状态查看临时密码用临时密码登录修改密码 安装 VMware 以及 CentOS 由于本博主之前写过&#xff0c;在这给出链接&#xff0c;不再赘述了 https://blog.csdn.net/w…

2023.4.30 第五十一次周报

目录 前言 文献阅读 背景 对现有技术的分析 主要思路和贡献 相关性分析和归一化处理 相关性分析 归一化处理 TCN 基于 TCN-LSTM 的 PM 浓度预测模型 敏感性分析 论文思路 求半方差 训练模型 -1 训练模型-2 总结 前言 This week I studied an article that cons…

R语言 | 进阶字符串的处理

目录 一、语句的分割 二、修改字符串的大小写 三、unique()函数的使用 四、字符串的连接 4.1 使用paste()函数常见的失败案例1 4.2 使用paste()函数常见的失败案例2 4.3 字符串的成功连接与collapse参数 4.4 再谈paste()函数 4.5 扑克牌向量有趣的应用 五、字符串数据的…

vue前端开发100问(持续更新)

1.export default的作用是 export主要用于对外输出本模块变量的接口&#xff0c;一个文件就可以被理解为一个模块。export就是导出。 import就是在一个模块中加载另一个含有export接口的模块&#xff0c; import就是导入。 2.什么样的内容需要放在export default里面&#xf…