C++11——lambda表达式

文章目录
- 1. C++98对自定义类型的排序
- 2. lambda表达式语法
- 2.1 捕捉列表
- 3. lambda底层原理
1. C++98对自定义类型的排序
在C++98中,想要对自定义类型就行排序,我们得自己写仿函数来表明我们相对哪一项进行排序
struct Student
{Student(string name, long id, double score):_name(name),_id(id),_score(score){}string _name;long _id;double _score;
};//按名字排序 -- 降序
struct CmpName
{bool operator()(const Student& stu1, const Student& stu2){return stu1._name < stu2._name;}
};
//按学号排序 -- 降序
struct CmpId
{bool operator()(const Student& stu1, const Student& stu2){return stu1._id < stu2._id;}
};
//按分数排序 -- 降序
struct CmpScore
{bool operator()(const Student& stu1, const Student& stu2){return stu1._score < stu2._score;}
};int main()
{vector<Student> v = { {"张三",101,99.3},{"李四",104,85.2},{"王五",102,99.9} };sort(v.begin(), v.end(),CmpName());sort(v.begin(), v.end(),CmpId());sort(v.begin(), v.end(),CmpScore());return 0;
}
如果代码风格较好,然后加上了注释,这其他人一看就懂是什么意思。但如果命名不规范,就是个很头疼的问题。
例如:
int main()
{vector<Student> v = { {"张三",101,99.3},{"李四",104,85.2},{"王五",102,99.9} };sort(v.begin(), v.end(),Cmp1());sort(v.begin(), v.end(),Cmp2());sort(v.begin(), v.end(),Cmp3());return 0;
}
这里的仿函数,我们看到就不知道是对哪一项进行排序,就得往前翻,如果前面的命名也不规范,那就十分痛苦。
而且一旦我们的对象的参数多了,那我们就得写出对应的仿函数,这不是很方便,于是在C++11中出现了lambda表达式
2. lambda表达式语法
lambda表达式格式:[capture-list] (parameters) mutable -> return-type { statement }
示例:
[] (int x,int y)->int { return x+y;}
-
lambda表达式各部分说明[]:捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来 判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。():参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以 连同()一起省略。mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。{statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。
int main()
{vector<Student> v = { {"张三",101,99.3},{"李四",104,85.2},{"王五",102,99.9} };sort(v.begin(), v.end(), [](const Student& stu1, const Student& stu2)->bool {return stu1._name < stu2._name; });sort(v.begin(), v.end(), [](const Student& stu1, const Student& stu2)->bool {return stu1._id < stu2._id; });sort(v.begin(), v.end(), [](const Student& stu1, const Student& stu2)->bool {return stu1._score < stu2._score; });return 0;
}
2.1 捕捉列表
-
[var]:表示值传递方式捕捉变量var
int a = 1; int b = 2; double rate = 2.5; auto f1 = [rate](int x, int y) {return x + y; }; cout<<f1(a,b)<<endl; //输出 7.5 -
[&var]:表示引用传递捕捉变量var
适用于对象较大或者需要修改捕捉列表里面的值
int a = 1; int b = 2; auto swap1 = [a, b]() mutable {//mutable让捕捉的a b可以修改//但这里面的a b 属于是外面a b的拷贝int tmp = a;a = b;b = tmp; }; swap1();auto swap2 = [&a, &b] {//捕捉引用,可以直接修改外面a b的值了int tmp = a;a = b;b = tmp; }; swap2(); -
[=]:表示值传递方式捕获所有父作用域中的变量(包括this)
捕捉所有的外部变量
int a = 1; int b = 2; int c = 3; auto f2 = [=]() {cout << a << " " << b << " " << c << " " << endl; }; f2(); -
[&]:表示引用传递捕捉所有父作用域中的变量(包括this)
捕捉所有外部变量的引用
int a = 1; int b = 2; int c = 3; auto f3 = [&]() { cout << ++a << " " << ++b << " " << ++c << " " << endl; }; f3(); cout << a << " " << b << " " << c << " " << endl; //也可以混合捕捉,这里的a就是不可修改的了,普通捕捉 auto f4 = [&, a] { cout << a << " " << ++b << " " << ++c << " " << endl; }; cout << a << " " << b << " " << c << " " << endl; -
[this]:表示值传递方式捕捉当前的this指针
3. lambda底层原理
int main()
{auto f1 = [](int x, int y) {return x + y; };auto f2 = [](int x, int y) {return x + y; };//f1 = f2; //errorcout << typeid(f1).name() << endl;cout << typeid(f2).name() << endl;return 0;
}
这段代码运行之后发现,f1和f2的类型是类

这里lambda的底层就是一个仿函数,就和范围的for的底层就是迭代器一样,上层将其封装了,调用的就是类的operator()

相关文章:
C++11——lambda表达式
文章目录 1. C98对自定义类型的排序2. lambda表达式语法2.1 捕捉列表 3. lambda底层原理 1. C98对自定义类型的排序 在C98中,想要对自定义类型就行排序,我们得自己写仿函数来表明我们相对哪一项进行排序 struct Student {Student(string name, long id…...
美国加密货币交易和借贷平台Membrane Labs完成2000万美元融资
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,总部位于美国纽约的加密货币交易和借贷平台Membrane Labs今日宣布已完成2000万美元A轮融资。 参与本轮融资的投资机构包括:Brevan Howard Digital、Point72 Ventures、Jane Street Cap…...
8-k8s-污点与容忍
文章目录 一、概念二、相关操作三、实操污点NoSchedule四、实操污点NoExecute五、实操容忍 一、概念 污点与容忍 污点taints定义在节点之上的键值型属性数据。当节点被标记为有污点,那么意味着不允许pod调度到该节点。 容忍tolerations是定义在 Pod对象上的键值型属…...
钢铁异常分类140篇Trans 学习笔记 小陈读paper
钢铁异常分类 对比学习 比较好用 1.首先,为每个实例生成一对样本, 来自同一实例的样本被认为是正例, 来自不同实例的样本被认为是负例。 2.其次,这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下, …...
YOLOv5-理论部分
YOLOv5 作者: Ultralytics 论文源码: https://github.com/ultralytics/yolov5 Ultralytics:“超视觉技术” / “超视觉系统” 0. 引言 “YOLOv5 🚀 是世界上备受喜爱的视觉人工智能,代表了 Ultralytics 对未来视觉人工智能方法的开源研究&a…...
蓝桥等考C++组别一级004
第一部分:选择题 1、C L1(15分) 下列是编程语言的一项是( )。 A. C B. Word C. Excel D. PowerPoint 正确答案: A 2、C L1(15分) 仔细阅读以下程序代码,其中有…...
分布式服务的链路跟踪 Sleuth Micrometer zipkin OpenTelemetry
由来 在分布式应用开发过程中,一个请求会调用多个应用,会有那种需要知道各个应用之间耗时的想法,这样可以知道一个调用的总时长以及各个组件之间的处理耗时,后面方便定位问题。 理论依据 起源于 google dapper 论文 https://re…...
CUDA学习笔记4——自定义设备函数
自定义设备函数 核函数:__global__修饰;在设备中执行;设备函数:__device__修饰;在设备中执行;只能被核函数或其他设备函数调用;主机函数:__host__修饰(可省略࿰…...
微前端四:qiankun在开发中遇到的问题
在qiankun开发中会遇到很多问题,上一篇微前端三:qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题,下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…...
Android DisplayPolicy增加一些动作,打开后台接口
Android DisplayPolicy增加一些动作,打开后台接口 前言一、了解android全局滑动事件的拦截二、修改1.DisplayPolicy.java修改 前言 一些后台接口 界面之类的不方便打开,但是测试需要用到,这里就添加一个10秒内上拉6下,打开一个后…...
基于Linux安装Hive
Hive安装包下载地址 Index of /dist/hive 上传解压 [rootmaster opt]# cd /usr/local/ [rootmaster local]# tar -zxvf /opt/apache-hive-3.1.2-bin.tar.gz重命名及更改权限 mv apache-hive-3.1.2-bin hivechown -R hadoop:hadoop hive配置环境变量 #编辑配置 vi /etc/pro…...
FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持
目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…...
重复控制逆变器的仿真分析研究
摘 要 本次设计主要以重复控制逆变器控制系统设计应用作为研究背景,运用MATLAB/Simulink仿真工具搭建相应的仿真模型。重复控制逆变器控制系统拥有很好的动态特性,运行稳定性高、调速的范围较大,性能可靠等,在实际生产制造中被广…...
WuThreat身份安全云-TVD每日漏洞情报-2023-10-18
漏洞名称:致远 OA XML 外部实体注入漏洞 漏洞级别:高危 漏洞编号:NULL 相关涉及:V5/G6 V6.0及以上全系列版本 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-26027 漏洞名称:XNSOFT NCONVERT 图像文件缓冲区溢出 漏洞级别:中危 漏洞编号:CVE-…...
开启机器人学新时代,《机器人学建模、规划与控制》完美诠释未来
机器人学是未来发展的热点领域之一,而在这个领域中,建模、规划与控制则是必不可少的基础技术。今天作者要向大家推荐一本机器人学领域的经典教材——《机器人学建模、规划与控制》。 这本书由西安交通大学出版社出版,作者是机器人学专业的鼎…...
C#根据ip获取地理位置信息的方法,史上最全
商业收费 百度地图高德地图腾讯地图纯真IP 开源免费 纯真ip免费版 以前可以直接下载,现在获取ip数据库的方式改变了,自行官网查看把,个人或者学术研究,商用追责,商业用途慎用 using System.Collections.Generic; us…...
Git问题汇总
1.取消全局代理 一般报错Failed to connect to github.com port 443 after 21089 ms: Couldn’t connect to server 取消全局代理: git config --global --unset http.proxygit config --global --unset https.proxy#或者 git config --global http.proxy http://…...
【linux 0.11 学习记录】一、环境配置,用Bochs输出hello world
想学习linux,又不知道从哪里下手,体系太大,哪块内容都很多,无奈下选择了linux0.11作为入口,本系列将是学习笔记,希望能坚持下去吧 环境配置 这里使用win10bochs2.7 安装bochs 官网:https://b…...
【LeetCode75】第七十三题 用最少数量的箭引爆气球
目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 本题和上一题基本一样,上一题是要我们尽量让区间不重叠,而本题是要我们尽量让区间重叠。 所以我们的做法和上一题…...
航天科技×辰安科技 打造智慧化工园区安全保障平台
近年来,国内化工园区安全事故频发,多起化工园区重特大事故造成了严重人员财产损失的同时,也重创了行业的整体发展。在智能制造和工业互联网的背景下,建设智慧化工园区,使用智能化手段实现安全生产是解决当前化工园区安…...
STM32F103C8T6 Bootloader分区与跳转详解:手把手配置64KB Flash的16+48分配方案
STM32F103C8T6 Bootloader分区与跳转实战:64KB Flash的1648分配方案深度解析 在嵌入式开发中,Bootloader的设计往往是项目成败的关键一环。对于资源受限的STM32F103C8T6这类仅有64KB Flash的MCU来说,如何在Bootloader和应用程序之间合理分配这…...
终极指南:使用免费开源工具SMUDebugTool解锁AMD Ryzen处理器全部性能 [特殊字符]
终极指南:使用免费开源工具SMUDebugTool解锁AMD Ryzen处理器全部性能 🚀 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power T…...
量子架构搜索:结合张量网络与强化学习的创新方法
1. 量子架构搜索的现状与挑战量子计算正经历从理论走向实践的关键转型期,但当前NISQ(噪声中等规模量子)设备的局限性给算法实现带来了严峻挑战。这些设备通常只有50-100个量子比特,且存在显著的噪声和有限的量子比特连通性。在这样…...
终极指南:3步掌握FakeLocation应用级虚拟定位保护隐私
终极指南:3步掌握FakeLocation应用级虚拟定位保护隐私 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你是否担心手机应用过度获取你的真实位置?想不想为微…...
Geothermal Power Generation Global Market Trends 2026:地热发电为何正在成为新一轮能源工程竞争核心
观点|地热发电的竞争逻辑已经发生变化过去很多人认为地热发电属于区域性能源项目。但现在,行业真正变化的是:地热正在从“资源开发工程”,转向“稳定电力基础设施工程”。相比波动性较强的风电与光伏,地热发电最大的优…...
接触动力学与CTR-MPC在机器人操作中的应用
1. 接触动力学基础与挑战 接触动力学是机器人操作中的核心问题,它描述了物体间相互作用时的力学行为。想象一下我们用手推动桌面的杯子——指尖与杯壁的接触力既要防止穿透(非穿透性约束),又要克服滑动摩擦(摩擦锥约束…...
《字节码到JVM:Java基础核心知识点全解析(小林八股·上)》
🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...
5分钟搭建拼多多商品数据采集系统:电商从业者的完整解决方案
5分钟搭建拼多多商品数据采集系统:电商从业者的完整解决方案 【免费下载链接】scrapy-pinduoduo 拼多多爬虫,抓取拼多多热销商品信息和评论 项目地址: https://gitcode.com/gh_mirrors/sc/scrapy-pinduoduo 在电商竞争日益激烈的今天,…...
TypeScript-------------类型收窄
//类型收窄 //typeof 类型收窄 function uppercase(content:string|number) {if(typeof content string)//收窄的类型有限{return content.toUpperCase();}return content; }//真值收窄 function getString(content?:string)//加?表示参数可传可不传 {if(typeof …...
STM32F103驱动ST7567 LCD屏:手把手教你移植U8g2库(SPI接口,附完整工程)
STM32F103驱动ST7567 LCD屏:从零开始移植U8g2库实战指南 当你第一次拿到一块ST7567驱动的LCD屏时,可能会被各种引脚定义和初始化代码搞得晕头转向。本文将带你从硬件连接到软件移植,一步步完成U8g2库在STM32F103上的适配过程。不同于简单的代…...
