当前位置: 首页 > news >正文

C++11 Lambda表达式

文章首发公众号:iDoitnow

为什么引入Lambda

Lambda表达式是一个可以内联在我们代码中的函数,我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前,当我们遇到需要对多个数据,按照同一规则进行操作的时候,创建机动函数会更简单,但是必须在其他地方定义好该函数,然后再使用它,有时候两者之间可能距离离的很远,想要了解该函数内部操作的原理,需要翻阅多页源代码找它的定义,这样使得代码的可读性大打折扣。这就是Lambda表达式出现的主要原因。

基本的Lambda语法

lambda表达式是一个匿名函数。其可以捕获作用域中的变量。其在C++11中常用的语法如下:

[captures](params){body}
[captures]{body}  //省略了形参列表,函数不接收实参,如同形参列表为()
[captures](params)->return-type{body}  //return-type为返回类型//eg:
//捕获列表     参数列表           函数体[ ]   (int a, int b)  { return a < b;}
//捕获列表     参数列表      返回类型          函数体[ ]   (double x)  -> double   {int y = x; return x - y;}
/*注:Lambda函数没有声明返回类型,其返回类型相当于使用decltyp根据返回值推断得到的。如果函数体内不包含返回语句,则推断出返回类型为void。但是仅当函数体完全由一条返回语句组成时,自动类型推断才管用否则,需要使用新增的返回类型后置语法*/

:Lambda表达式自动推断返回值类型:有些编译器,像GCC,即使你有多于一个返回语句也不可以自动推断成功,但标准不保证这一点,因此为了防止意外的发生,当函数体内返回语句不止一条的时候,建议使用返回类型后置语法】

其中captures为捕获,它一个包含0个或者多个捕获符的用逗号分隔的列表。params为参数列表,body为函数体。默认的捕获符只有:

  • &:采用引用隐式捕获的方式使用自动变量

  • =:采用复制隐式捕获的方式使用自动变量

    []        // 默认不捕获
    [&]       // 默认以引用捕获(意味着在函数体内可以按照引用的方式使用Lambda表达式所在范围内所有可见的局部变量)
    [&, i]    // 以引用捕获(同上),但i以值捕获
    [=]       // 默认以复制捕获(意味着在函数体内可以按照值传递的方式使用Lambda表达式所在范围内所有可见的局部变量)
    [=, &i]   // 以复制捕获(同上),但 i 以引用捕获
    

下面我们通过C++ Primer Plus中的一个例子进一步理解Lambda表达式:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
const long Size = 390000L;
int main()
{using std::cout;std::vector<int> numbers(Size);std::srand(std::time(0));std::generate(numbers.begin(), numbers.end(), std::rand);cout << "Sample size = " << Size << '\n';// using lambdasint count3 = std::count_if(numbers.begin(), numbers.end(),[](int x){return x % 3 == 0;});cout << "Count of numbers divisible by 3: " << count3 << '\n';int count13 = 0;std::for_each(numbers.begin(), numbers.end(),[&count13](int x){count13 += x % 13 == 0;});cout << "Count of numbers divisible by 13: " << count13 << '\n';// using a single lambdacount3 = count13 = 0;std::for_each(numbers.begin(), numbers.end(),[&](int x){count3 += x % 3 == 0; count13 += x % 13 == 0;});cout << "Count of numbers divisible by 3: " << count3 << '\n';cout << "Count of numbers divisible by 13: " << count13 << '\n';return 0;
}

程序输出结果:

Sample size = 390000
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009
Count of numbers divisible by 3: 130274
Count of numbers divisible by 13: 30009

Lambda与STL的结合

当STL中的算法(algorithms)库遇到Lambda的时候,会碰出什么样的火花呢?毋庸置疑,这极大的提高我们的编程效率,更提高了代码的整洁性和可读性,例如:

vector<int> v;
v.push_back(1);
v.push_back(2);
//不使用Lambda表达式
for ( auto itr = v.begin(); itr != v.end(); itr++ )
{cout << *itr;
}//使用Lambda表达式
for_each( v.begin(), v.end(), [] (int val){cout << val;} );

正如上面的例子,使用Lambda表达式后,代码显的更漂亮,而且它的可读性也很强,结构更紧凑。

总结

Lambda 引入,使我们在某些情况下,能够将类似于函数的表达式用作接受函数指针或函数符的函数的参数。它更像胶水代码,允许我们将简单的处理逻辑传递到需要的位置,提高开发效率,使得代码结构简洁而且易于理解。

参考文献

C++ Primer Plus(第六版) - 第18章 探讨C++新标准
C++ 参考手册

相关文章:

C++11 Lambda表达式

文章首发公众号&#xff1a;iDoitnow 为什么引入Lambda Lambda表达式是一个可以内联在我们代码中的函数&#xff0c;我们可以将他传递给另外一个函数。在没有引入Lambda表达式之前&#xff0c;当我们遇到需要对多个数据&#xff0c;按照同一规则进行操作的时候&#xff0c;创建…...

冰湖灾害遥感监测评价与模拟分析

查看原文>>>mp.weixin.qq.com/s?__bizMzAxNzcxMzc5MQ&mid2247582638&idx1&sna22a1697b16a5edc2b74cb1ccf011689&chksm9be29cbeac9515a8227460103ae1b9f280af688eab0ce5a43448f9fa7c9cab820c389fcdc031&token10630879&langzh_CN#rd【专家简介…...

Highcharts.Chart

Highcharts 是一个使用javascript 脚本来生成图表的工具&#xff0c;和jfreechart 作用类似&#xff0c;都用来生成各种图表&#xff0c;并支持图片的导出和打印。 从官网 www.highcharts.com 上下载的压缩表中的example中有各种图表的例子。 要编写生成图表的例子建议从 文…...

遍历map的几种方法

#先往map加入几个数据 Map<Integer,String> mapnew HashMap<>(); map.put(1,"美好的周一"); map.put(2,"美好的周二"); map.put(3,"美好的周三"); 1 2 3 4 方法一&#xff1a;普通的foreach循环&#xff0c…...

RocketMQ源码分析之Broker概述与同步消息发送原理与高可用设计及思考

1、Broker概述 Broker 在 RocketMQ 架构中的角色&#xff0c;就是存储消息&#xff0c;核心任务就是持久化消息&#xff0c;生产者发送消息给 Broker,消费者从 Broker 消费消息&#xff0c;其物理部署架构图如下&#xff1a; 备注&#xff1a;以上摘录自官方 RocketMQ 设计文档…...

K8s常见面试题总结

部分内容来自&#xff1a;k8s面试题大全&#xff08;持续更新中&#xff09; 目录 k8s常考面试题 1.1.什么是k8s&#xff1f; 1.2.简述Docker和Kubernetes的关系 1.3.k8s的组件有哪些&#xff0c;作用分别是什么&#xff1f; 1.4.简述kubelet的功能和作用 1.5.简述pod是…...

OpenFeign 自定义解码器Decoder 失效

问题描述 项目上开发了OpenFeign的自定义解码器&#xff0c;用来统一处理返回结果。 开发完后测试已经生效了&#xff0c;过两天后&#xff0c;这块代码没有变动的情况下&#xff0c;发现请求结果突然又不走自定义的解码器了。 代码如下 解码器 BaseResponseFeignDecoder …...

c++练习题8

1&#xff0e;在do-while循环中&#xff0c;循环由do开始&#xff0c;用while结束&#xff1b;必须注意的是&#xff1a;在while表达式后面的 不能丢&#xff0c;它表示do-while语句的结束。 A&#xff09;0 B&#xff09;1 C&#xff09;&#xff1b;…...

Python循环语句代码详解:while、for、break

目录 1 while循环 1 while循环 循环语句是程序设计中常用的语句之一。任何编程语言都有while循环&#xff0c;Python也不例外。while循环的格式如下所示。 while(表达式): … else: … while循环的执行过程&#xff1a;当循环表达式为真时&#xff0c;依次执行whi…...

vue父子组件传值不能实时更新

最近做项目&#xff0c;遇到个大坑&#xff0c;这会爬出来了&#xff0c;写个总结&#xff0c;避免下次掉坑。 vue父子组件传值不能实时更新问题&#xff0c;父组件将值传给了子组件&#xff0c;但子组件显示的值还是原来的初始值&#xff0c;并没有实时更新&#xff0c;为什么…...

2023美赛A题思路数据代码分享

文章目录赛题思路2023年美国大学生数学建模竞赛选题&论文一、关于选题二、关于论文格式三、关于论文提交四、论文提交流程注意不要手滑美赛A题思路数据代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片&#xff0c;加入获取一手资源 202…...

【蓝桥杯集训·每日一题】AcWing 3768. 字符串删减

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴双指针一、题目 1、原题链接 3768. 字符串删减 2、题目描述 给定一个由 n 个小写字母构成的字符串。 现在&#xff0c;需要删掉其中的一些字母&#xff0c;使得字符串中不…...

Python|每日一练|树|深度优先搜索|数组|二分查找|链表|双指针|单选记录:填充每个节点的下一个右侧节点指针|搜索插入位置|旋转链表

1、填充每个节点的下一个右侧节点指针&#xff08;树&#xff0c;深度优先搜索&#xff09; 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *rig…...

降雨量实时监测系统压电式雨量计

压电式雨量传感器由上盖、外壳和下盖组成&#xff0c;壳体内部有压电片和电路板&#xff0c;可以固定在外径50mm立柱上和气象站横杆上。传感器采用冲击测量原理对单个雨滴重量进行测算&#xff0c;进而计算降雨量。雨滴在降落过程中受到雨滴重量和空气阻力的作用&#xff0c;到…...

滑动相关的原理以及用滤波器实现滑动相关(匹配滤波器捕获DMF)

目录滑动相关匹配滤波器捕获&#xff08;DMF&#xff09;滑动相关 滑动相关属于一种时域捕获方法&#xff0c;其具体原理是是通过本地序列与接收信号在固定窗长内滑动累加得到相关结果。 一般滑动相关算法可以用于对自相关性非常好的伪码进行同步判决。 我们首先生成一组自相关…...

计算机网络笔记(三)—— 数据链路层

数据链路层概述 数据链路层以帧为单位传输数据。 封装成帧&#xff1a;给网络层提供的协议数据单元添加帧头帧尾 差错检测&#xff1a;检错码封装在帧尾 可靠传输&#xff1a;尽管误码不能避免&#xff0c;但如果可以实现发送什么就接受什么&#xff0c;就叫可靠传输 封装成…...

【日常】矩阵正态分布参数检验问题

最近给凯爹做的一个苦力活&#xff0c;统计检验这个东西说实话也挺有趣&#xff0c;跟算法设计一样&#xff0c;好的检验真的是挺难设计的&#xff0c;就有近似算法的那种感觉&#xff0c;检验很难保证size和power都很理想&#xff0c;所以就要做tradeoff&#xff0c;感觉这个假…...

QML矩形(Rectangle)

Rectangle 用于绘制矩形 常见的属性&#xff1a; 填充颜色&#xff1a;纯色&#xff1a;color 渐变 &#xff1a;Gradient类 渐变的优先级大于纯色Gradient&#xff08;渐变色&#xff09;&#xff1a; 渐变由多种颜色定义&#xff0c;这些颜色将无缝混合&#xff0c…...

CSS自定义鼠标样式

CSS自定义鼠标样式 属性值 属性描述url需使用的自定义光标的 URLdefault默认光标&#xff08;通常是一个箭头&#xff09;auto默认。浏览器设置的光标crosshair光标呈现为十字线pointer光标呈现为指示链接的指针&#xff08;一只手&#xff09;move此光标指示某对象可被移动e…...

春招Leetcode刷题日记-D4-双指针算法-滑动窗口快慢指针

D4-双指针算法-滑动窗口&&快慢指针快慢指针算力扣141. 环形链表思路代码力扣142. 环形链表 II思路代码滑动窗口力扣76. 最小覆盖子串思路代码力扣424. 替换后的最长重复字符思路代码快慢指针算 快慢指针算法&#xff0c;多用于链表当中&#xff0c;常见的如&#xff1…...

【go】结合一个go开源项目分析谷歌浏览器cookie为什么不安全 附go项目导包失败怎么解决教程

本文创作背景 源于谷歌浏览器提示密码被泄露 并且某站很快收到了异地企图登录的提醒。 当即怀疑是不是谷歌浏览器保存的密码不安全&#xff0c;最后查阅诸多资料 并找到一个go语言编写的开源项目进行研究&#xff0c;虽然最终不能确定密码是如何泄露的 但研究结论还是让人不由感…...

Windows瘦身方法

一、快速删除系统盘临时文件方法, 1、winr打开运行对话框&#xff0c;输入%temp%命令&#xff0c;如图1 图1 2、打开temp文件夹&#xff0c;如图2&#xff0c;选择所有文件&#xff0c;鼠标右键删除或按Del键删除。 图2 二、磁盘清理 1、winr&#xff0c;输入cleanmgr&#x…...

19. 删除链表的倒数第 N 个结点

题目链接&#xff1a;https://leetcode.cn/problems/remove-nth-node-from-end-of-list/进阶&#xff1a;你能尝试使用一趟扫描实现吗&#xff1f;解题思路&#xff1a;最简单的方法是先遍历一次链表&#xff0c;得到链表的长度len&#xff0c;然后再一次遍历链表&#xff0c;遍…...

【Linux】网络编程 - 基础概念

目录 一.OSI七层模型vsTCP/IP五层模型 1.一些周边概念 2.OSI七层模型 3.TCP/IP五层模型 4.网络传输流程图 二.什么是MAC地址 三.什么是IP/IP地址 1.什么是IP 2.什么是IP地址 四.什么是端口号 一.OSI七层模型vsTCP/IP五层模型 1.一些周边概念 局域网vs广域网 网络互…...

Unity 多语言 轻量高效的多语言工具集 LanguageManager

效果展示 支持excel导入自动化 组件化 更方便 也提供直接获取多语言的接口 没有挂 LanguageText的对象也可以获取多语言文本内容 支持 Format接口 可以传递N个参数进来组装多语言 支持首次系统语言自测 支持语言切换后本地自动保存配置 支持实时切换 同步刷新所有UI 容错处…...

在Linux和Windows上安装zookeeper-3.5.9

记录&#xff1a;378场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;安装zookeeper-3.5.9。在Windows上操作系统上&#xff0c;安装zookeeper-3.5.9。版本&#xff1a;JDK 1.8 CentOS 7.9 zookeeper-3.5.9官网地址&#xff1a;https://zookeeper.apache.org/源码地址&…...

【ESP32+freeRTOS学习笔记-(八)资源管理】

目录1、 资源使用概况2、互斥方法之一&#xff1a;基本临界区2.1、taskENTER_CRITICAL_FROM_ISR() 和taskEXIT_CRITICAL_FROM_ISR()3、互斥方法之二&#xff1a;挂起或锁定调度程序3.1 vTaskSuspendAll()3.2 xTaskResumeAll()4 互斥方法三&#xff1a;互斥信号量&#xff08;和…...

P1427 小鱼的数字游戏(赋值运算符和String)

小鱼的数字游戏 题目描述 小鱼最近被要求参加一个数字游戏&#xff0c;要求它把看到的一串数字 aia_iai​&#xff08;长度不一定&#xff0c;以 000 结束&#xff09;&#xff0c;记住了然后反着念出来&#xff08;表示结束的数字 000 就不要念出来了&#xff09;。这对小鱼…...

Java学的好,工作不愁找

俗话说的好&#xff1a;“Java学的好&#xff0c;工作不愁找”&#xff0c;不管我们学习哪一门语言&#xff0c;我们都要掌握从抽象化中提取出来的方法&#xff0c;这样你才能提高我们的学习能力&#xff0c;并且在学习新事物的时候可以提取我们自己的想法。学习java&#xff0…...

表情包可视化编辑、生成配置信息数据工具

合成GIF图片 - 表情包 后续&#xff0c;用于快速、便捷生成 img_config.js 中 要生成的GIF每一帧数据&#xff08;写入头像图片信息参数&#xff09;&#xff1b; 1、先上传 写入GIF中头像 标准图&#xff0c;同时获取图片信息&#xff0c;更新 写入GIF中头像 初始值&#xff0…...

重庆商城网站制作报价/网络营销的用户创造价值

目录 docker 安装ElasticSEarch亲测步骤 1:docker search ElasticSearch ​2: docker pull elasticsearch:5.1.1 3&#xff1a;下载好后&#xff0c;查看镜像&#xff1a;docker images ​4:创建实例启动&#xff1a; ​5:查看服务&#xff1a;docker ps ​6&#xff1a…...

微信支付 网站建设/下载百度安装

互联网流量向手机倾斜&#xff0c;而手机端的APP又让浏览器变得不再举足轻重。但对于电脑用户而言&#xff0c;浏览器依然是大家日常离不开的工具&#xff1a;Opera、Chrome、IE、Edge(新老不同)、Firefox。在这其中又有多款浏览器使用了相同的内核(渲染及脚本引擎)&#xff0c…...

网站建设 asp 武汉/天眼查企业查询入口

功能需求&#xff1a; 在监督监理项目的Word报告模块中&#xff0c;要求实现对Word文件内容操作的撤销、重做功能。 实施方案&#xff1a; 采用备忘录模式实现。 要点一&#xff1a;备忘录模式 应用程序在每次操作之后都改变了他的状态。也就是说一个应用程序一旦被操作&#x…...

聊城网站制作公司/互联网线上推广

题目描述 将给出的整数x翻转。 例1:x123&#xff0c;返回321 例2:x-123&#xff0c;返回-321 你有思考过下面的这些问题么&#xff1f; 如果整数的最后一位是0&#xff0c;那么输出应该是什么&#xff1f;比如10,100 你注意到翻转后的整数可能溢出吗&#xff1f;假设输入是3…...

晋江文学城电脑版/搜索引擎排名优化公司

报道&#xff5c;深度学习这件小事网络上流传了一份一二线城市知名的互联网&#xff08;或者说IT相关&#xff09;公司名单&#xff0c;比较全&#xff0c;本文新增了一些&#xff0c;还有一些已经淡出圈子的就删除了&#xff0c;做了一些修改&#xff0c;相对较新。当然了&…...

电商网站开发设计方案/磁力猫搜索引擎入口官网

我必须将客户MySql数据库架构/数据迁移到MS SQL SERVER 2008.最后我收到了70 Mb的SQL文件,其中mySQL方言与MSSQL不兼容.DROP TABLE IF EXISTS kladr;CREATE TABLE kladr (id int(11) NOT NULL DEFAULT 0,idp int(11) DEFAULT NULL,...花了一个星期的谈判才收到这样的文件,所以我…...