C++11_lambda

lambda表达式

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。比如说,我想在某宝买一件商品,我想买该商品价格最便宜的哪一个,这就需要对价格排升序;我如果想买性价比最高的,就需要按照综合进行排降序...

但随着C++语法的发展,有人开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类(仿函数),如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。因此,在C++11语法中引入了lambda表达式。

lambda表达式的语法

lambda表达式书写格式:

[capture-list] (parameters) mutable -> return-type { statement }

  • [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[ ]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用
  • (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略
  • mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)
  • ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
  • {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

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

从某种程度上说,lambda函数是一个匿名函数对象。为什么?匿名函数的构成不就是返回值、参数列表和函数体吗,这三种东西在lambda同样存在。

// 见一见lambda表达式
int main()
{auto add = [](int x, int y)->int {return x + y; };cout << add(10, 20) << endl;    //像函数一样调用// 下面代码中的()->int可省略// 无参数可省略// 返回值类型可自动推导,可省略(建议不要省略)auto func = []//()->int{cout << "hello world" << endl;return 0;        }return 0;
}

捕捉列表的说明

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

[var]:表示值传递方式捕捉变量var

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

[&var]:表示引用传递捕捉变量var

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

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

int main()
{// 传值捕捉的本质是一种拷贝,并且默认被const修饰,// mutable相当于去掉了const属性,使该值可以被修改,// 但是修改了不会影响外面捕捉的值,因为这是一种拷贝。int a = 10, b = 20;auto swap2 = [a, b]()mutable{int tmp = a;a = b;b = tmp;};swap2();return 0;    // 输出结果:a = 10, b = 20
}

所以如果要想修改变量的值,需要使用引用传递捕捉:

int main()
{// 传引用捕捉默认不是const,所以不需要mutableint a = 10, b = 20;auto swap3 = [&a, &b](){int tmp = a;a = b;b = tmp;};swap3();return 0; // 输出结果:a = 20, b = 10
}

还有一种捕捉方式,叫做混合捕捉

// 混合捕捉
// 所有值以传引用的方式捕捉,d以传值的方式捕捉
auto func2 = [&, d]{a++;b++;c++;//d++;int ret = a + b + c + d;return ret;};
// 所有值以传值的方式捕捉,d以传引用的方式捕捉
auto func2 = [=, &d]{//a++;//b++;//c++;d++;int ret = a + b + c + d;return ret;};

函数对象(仿函数)与lambda表达式

先来看一段代码

class Rate
{
public:Rate(double rate) : _rate(rate){}double operator()(double money, int year){return money * _rate * year;}
private:double _rate;
};
int main()
{// 函数对象(仿函数)double rate = 0.03;Rate r1(rate);cout << r1(10000, 2) << endl;		// 调用仿函数// lambdaauto r2 = [rate](double money, int year)->double {return money * rate * year;};cout << r2(10000, 2) << endl;		// 调用lambdareturn 0;
}

上述代码的输出结果r1和r2都等于600。仔细观察上述代码不难发现r1和r2的调用方式都是完全相同的,函数对象将rate作为其成员变量,在定义对象时给出初始值,lambda表达式通过捕获列表可以直接将该变量捕获到。在语法层,我们看到他们的实现代码完全不同,但是在其底层,他们都是仿函数。请看下图:

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

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

相关文章

用户登录与信息管理:实现小程序登录与用户信息存储

用户登录与信息管理&#xff1a;实现小程序登录与用户信息存储 在现代的移动应用中&#xff0c;用户登录与信息管理是构建个性化用户体验的基础。小程序作为轻量级的应用形式&#xff0c;在简化开发流程的同时&#xff0c;也需要我们妥善管理用户的登录状态与用户信息。本文将…

跨平台音乐播放器Feishin

什么是 Feishin &#xff1f; Feishin 是一款现代的自托管音乐播放器&#xff0c;支持多种音乐来源和功能。它是由Sonixd 的重构版本发展而来&#xff0c;能够与 Navidrome 或 Jellyfin API 音乐服务器兼容&#xff0c;目前还不支持 Subsonic API 。Feishin 具有现代化的用户界…

大论文记录

基础知识回顾 1.强化学习&#xff08;Agent、Environment) 在 RL 中&#xff0c;代理通过不断与环境交互、以试错的方式进行学习&#xff0c;在不确定性下做出顺序决策&#xff0c;并在探索&#xff08;新领域&#xff09;和开发&#xff08;使用从经验中学到的知识&#xff…

Linux 信号详解

目录 一.前置知识 1.前台进程和后台进程 a.概念理解 b.相关指令 2.信号的前置知识 a.Linux 系统下信号的概念 b.进程对信号的处理方式 3.信号的底层机制 二.详解信号 1.信号的产生 a.键盘组合键 b.kill 指令和系统调用接口 ① kill 指令 ② kill() 系统调用接口 ③ raise() 系统…

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 &#x1f4af;ChatGPT的数据使用特点ChatGPT数据安全…

学校在线学习作业批改教学管理平台的设计与实现SpringBoot+VUE

目录 一、项目背景及目标 二、技术选型 三、系统功能模块设计 四、关键技术实现 五、总结 在当今社会上&#xff0c;随着社会的发展和进步&#xff0c;对于现代的学生来说网络课程已经广泛应用于学校的每个角落&#xff0c;而一个课程教学管理平台对于现如今的课堂是不可缺…

资源《Arduino 扩展板4-单游戏摇杆》说明。

资源链接&#xff1a; Arduino 扩展板4-单游戏摇杆 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件…

华为资源分享

紫光云文档中心提供弹性计算服务文档https://www.unicloud.com/document/product/ElasticComputeService/index.html报文格式华为报文格式资料Info-Finder&#xff08;在线工具&#xff09; 报文格式华为IP网络电子书华为IP网络相关电子书IP网络系列丛书 - 华为企业业务华为产品…

(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录 前言 实现效果 支持方向变换 修改默认效果 如何修改 总结 前言 我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动&#xff0c;本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。 实现效果 上图是我们希望实现的效果&#xff0c;我们可以自发地控…

【递归】13. leetcode 1457. 二叉树中的伪回文路径

1 题目描述 题目链接&#xff1a;二叉树中的伪回文路径 2 解答思路 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系到具体函数体怎么写&#xff0c;是一个宏观的过…

已解决:Could not find artifact xxx

已解决&#xff1a;Could not find artifact xxx 文章目录 写在前面问题描述报错原因分析 解决思路解决办法1. 检查依赖声明的正确性2. 检查远程仓库配置3. 检查网络连接4. 清理本地缓存并强制更新5. 手动上传依赖到私有仓库6. 检查本地仓库是否已被损坏 总结 写在前面 在使用…

生信初学者教程(二十三):REF+SVM筛选候选标记物

文章目录 介绍加载R包导入数据准备数据机器学习特征筛选数据分割基础模型Recursive Feature Elimination特征筛选调参最终分类模型测试集验证标记基因输出结果总结介绍 采用了REF(Recursive Feature Elimination) 结合 SVM(Support Vector Machine) 的方法,对差异基因(参…

遥感影像-语义分割数据集:Landsat8云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括RGB三通道的高分辨率图像&#xff0c;在全球不同区域的分辨率15米。这些图像采集自Lansat8的五种主要土地覆盖类型&#xff0c;即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型landsat8覆盖区域未知场景水、植被、…

Llama3.2开源:Meta发布1B和3B端侧模型、11B和90B多模态模型

最近这一两周不少互联网公司都已经开始秋招提前批面试了。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友…

司法质量改善:巡回法庭的准自然实验(2000-2022年)(原始数据、计算代码、最终计算结果(Excel和Dta)和参考文献)

巡回法庭的设立背景 最高人民法院自2015年起分批次设立地方巡回法庭&#xff0c;以期改善司法质量&#xff0c;促进司法公正。这种改革措施为研究提供了一个独特的机会&#xff0c;可以通过准自然实验的方法来评估其效果。 2000-2022年司法质量改善&#xff1a;巡回法庭的准自…

ML 系列: (10)— ML 中的不同类型的学习

一、说明 我们之前将机器学习方法分为三类&#xff1a;监督学习、无监督学习和强化学习。机器学习方法可以分为不同的类型&#xff0c;我们将在下面讨论最重要的类型。 二、懒惰学习与急切学习 预先学习的工作原理是使用训练数据构建模型&#xff0c;然后使用此模型评估测试数据…

强大的JVM监控工具

介绍 在生产环境中&#xff0c;经常会遇到各种各样奇葩的性能问题&#xff0c;所以掌握最基本的JVM命令行监控工具还是很有必要的 名称主要作用jps查看正在运行的Java进程jstack打印线程快照jmap导出堆内存映像文件jstat查看jvm统计信息jinfo实时查看和修改jvm配置参数jhat用…

水域救援方案

水域救援是一项在复杂水域环境中进行的紧急救援行动&#xff0c;旨在保障人民生命财产安全、维护社会稳定&#xff0c;并促进相关产业的发展。以下是对水域救援的全面介绍&#xff1a; 一、定义与重要性 水域救援是指在人员在水域中生命受到严重威胁或重要场所、建筑物受到水…

前缀和(8)_矩阵区域和

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 前缀和(8)_矩阵区域和 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 温馨提示:…

MybatisPlus代码生成器的使用

在使用MybatisPlus以后&#xff0c;基础的Mapper、Service、PO代码相对固定&#xff0c;重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用&#xff0c;也很麻烦。 这里推荐大家使…