C++之lambda函数(匿名函数)
lambda函数简介
lambda函数是C++11标准新增的语法,也称为lambda表达式或匿名函数。
lambda函数的特点是:距离近、简洁、高效和功能强大。
优点
声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性。
简洁:不需要额外写一个命名函数或函数对象,,避免了代码膨胀和功能分散。
更加灵活:在需要的时间和地点实现功能闭包。
基本用法
[caoture] (params) opt -> ret {body;};
[捕获列表] (参数列表) 函数选型 -> 返回类型 {函数体} ;
注意
opt选项:
mutable:可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw ();
void test4()
{auto f = [](int a) -> int {return a + 1; };//捕获列表 cout << f(1) << endl;
}参数列表
参数列表是可选的,类似普通函数的参数列表,如果没有参数列表,()可以省略不写。
与普通函数的不同:
1. lambda函数不能有默认参数。
2. 所有参数必须有参数名。
3. 不支持可变参数。
返回类型
用后置的方法书写返回类型,类似于普通函数的返回类型,如果不写返回类型,编译器会根据函数体中的代码推断出来。
如果有返回类型,建议显式的指定,自动推断可能与预期不一致。
函数体
和普通函数的函数体一样
捕获列表
通过捕获列表,lambda函数可以访问父作用域中的非静态局部变量(静态局部变量可以直接访问,不能访问全局变量)。
捕获列表书写在[]中,与函数参数的传递类似,捕获方式可以是值和引用。
以下列出了不同的捕获列表的方式。

补充:
[ this ] --捕获当前类的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限
分别使用值捕获和引用捕获
void test()
{int a = 1;double b = 2.2;auto f1 = [](int a){cout << "a=" << a << endl;};auto f2 = [&](double m)->double{m++;return m;};f1(a);cout << "b=" << f2(b) << endl;
}隐式捕获
void test_2()
{int a = 1;double b = 2.3;auto f1 = [=]{cout << "a=" << a << ", b=" << b << endl;cout << "a=" << ++a << ", b=" << ++b << endl;};auto f2 = [&]{cout << "a=" << a << ", b=" << b << endl;cout << "a=" << ++a << ", b=" << ++b << endl;};f2();f1();
}混合方式捕获
lambda函数还支持混合方式捕获,即同时使用显式捕获和隐式捕获。
混合捕获时,捕获列表中的第一个元素必须是 = 或 &,此符号指定了默认捕获的方式是值捕获或引用捕获。
需要注意的是:显式捕获的变量必须使用和默认捕获不同的方式捕获。
修改值捕获变量的值
在lambda函数中,如果以传值方式捕获变量,则函数体中不能修改该变量,否则会引发编译错误。
在lambda函数中,如果希望修改值捕获变量的值,可以加mutable选项,但是,在lambda函数的外部,变量的值不会被修改。
void test_4()
{int a = 123;auto f = [a]()mutable { cout << ++a << endl; }; // 不会报错cout << a << endl; // 输出:123f(); // 输出:124cout << a << endl; // 输出:123
}函数本质
使用lambda表达式捕获列表外部变量,如果希望去修改按值捕获的外部变量,那么应该如何处理呢?这就要使用mutable选项,被mutable修改是lambda表达式就算没有参数也要写明参数列表,并且可以去掉按值捕获的外部变量的只读(const)属性。
#include<iostream>
using namespace std;
int main()
{int a = 10;auto f1 = [=] {++a; return a; }; //错误auto f2 = [=]()mutable {++a; return a; }; //正确auto f3 = [&] {++a; return a; }; //正确return 0;
}通过按值捕获的变量是只读的,按引用捕获的可以修改,而mutable可以去除按值捕获const的特点。
lambda表达式在c++中被视为一个仿函数
相关文章:
C++之lambda函数(匿名函数)
lambda函数简介lambda函数是C11标准新增的语法,也称为lambda表达式或匿名函数。lambda函数的特点是:距离近、简洁、高效和功能强大。优点声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性。简洁ÿ…...
WGCNA | 值得你深入学习的生信分析方法!~(网状分析-第四步-模块的功能注释)
1写在前面 前面我们用WGCNA分析得到多个模块,其中有一些模块和我们感兴趣的表型或者临床特征是相关的。🥳 接着就是要做模块的富集分析了,帮助我们了解这些模块的基因都有哪些已知的功能,涉及到哪些通路,在哪些疾病中最…...
如何看待年轻人躺平式生活观?
theme: smartblue 如何看待年轻人躺平式生活观? 躺平:网络流行词。指无论对方做出什么反应,你内心都毫无波澜,对此不会有任何反应或者反抗,表示顺从心理。另外在部分语境中表示为:瘫倒在地,…...
JS 设计模式 - 怎么让你的代码提示一个档次
设计模式是我们在解决一些问题的时候 ,针对特定的问题给出的简介并且优化的处理方案 这篇文章说提及到的 JavaScript 设计模式将围绕着封装方法类来展开叙述 构造器模式 构造器模式本质就是我们平常在编码中常用的封装方法,重复利用构造函数 // 这是…...
遮挡贴图(Occlusion Map)和微表面贴图(Microsurface Map)
遮挡贴图(Occlusion Map) 在3D图形学中,遮挡(Occlusion)是指光被物体挡住。即便是在PBR中,环境光在某些应该被遮挡的地方,也会以古怪的方式被反射。遮挡贴图(Occlusion Mapÿ…...
【Vue】基本交互指令
Vue el挂载点 <div id"app">{{message}} </div> <script>var app new Vue({el:"#app",data:{message:"hello"}}) </script>Vue实例的作用范围:管理el选项命中的元素及其内部的后代元素使用其他的选择器&a…...
MySQL 中的 distinct 和 group by 哪个效率更高?
结论先说大致的结论(完整结论在文末):在语义相同,有索引的情况下group by和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:distinct效率高于group by。原因是distinct 和 group by…...
Spring 框架源码(六) Bean的生命周期全流程源码解析
Spring框架作为Java王国的地基,我觉得它包含了很多精妙的设计,例如Bean工厂设计、Bean的生命周期、tx、aop、web、mvc等,最核心基本的Bean设计是Spring 的框架的灵魂,本文就Bean的生命周期全流程做源码程度上的解析,欢…...
运维服务商低成本提升服务质量解决方案
在信息化高速发展的今天,网络建设的重要性不言而喻,更多客户选择将运维服务外包或托管给运维服务商,市场需求愈大竞争压力愈大,想要脱颖而出势必要优化自身提高服务质量,最好是低成本、大提升,nVisual助力渠…...
Raft 一致性算法
Raft Raft提供了一种在计算系统集群中分布状态机的通用方法,确保集群中的每个节点都同意一系列相同的状态转换。 一个Raft集群包含若干个服务器节点,通常为5个,这允许整个系统容忍2个节点的失效。每个节点处于以下三种状态之一: …...
驱动程序开发:基于EC20 4G模块自动拨号联网的两种方式(GobiNet工具拨号和PPP工具拨号)
目录一、EC20 4G模块简介二、根据移远官方文档修改EC20 4G模组驱动 1、因为EC20 4G模组min-pice接口其实就是usb接口,因此需要修改Linux内核源码drivers/usb/serial/option.c文件,如下图: 2、根据USB协议的要求,需要在drive…...
Web自动化测试——常见问题篇
文章目录一、什么是自动化测试二、为啥进行自动化测试(优点)三、Webdriver 的工作原理四、显示等待和隐式等待的区别五、什么样的项目适合做自动化六、自动化测试的流程七、如何分析生成的自动化测试报告一、什么是自动化测试 所谓的自动化测试就是使用…...
快速实现Modbus TCP转BACnet IP协议的方案
一、需求背景 BACnet是用于智能楼宇自控系统的主流通信协议,可用在暖通空调系统(HVAC,包括暖气、通风、空气调节),也可以用在照明控制、门禁系统、火警侦测系统及其相关的设备。楼宇中的受控设备都通过BACnet协议连接到…...
Unity CircleLayoutGroup 如何实现一个圆形自动布局组件
文章目录简介实现原理Editor 编辑器简介 Unity中提供了三种类型的自动布局组件,分别是Grid Layou Group、Horizontal Layout Group、Vertical Layout Group,本文自定义了一个圆形的自动布局组件Circle Layout Group,如图所示: Ra…...
springcloud+nacos+gateway案例
一、先搭建好springcloudnacos项目地址:https://javazhong.blog.csdn.net/article/details/128899999二、spring cloud gateway简述Spring Cloud Gateway 是Spring Cloud家族中的一款API网关。Gateway 建立在 Spring Webflux上,目标是提供一个简洁、高效的API网关&a…...
实习这么久,你知道Maven是如何从代码仓库中找到需要的依赖吗?
目录 碎碎念 Maven是如何找到代码仓库里需要的依赖的? 如何根据坐标在本地仓库中寻找所需要的依赖? 如何根据坐标在远程仓库中寻找所需要的依赖? Maven 如何使用 HTTP 或 HTTPS 协议从远程仓库中获取依赖项,请详细解释其原理…...
低代码/零代码的快速开发框架
目前国内主流的低代码开发平台有:宜搭、简道云、明道云、云程、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势,定位也不同,用户可以根据自己需求选择。 一、阿里云宜搭 宜搭是阿里巴巴集团在20…...
C# 中常见的设计模式
设计模式是一套被广泛应用于软件设计的最佳实践,它们可以帮助开发者解决特定的问题,提高代码的可重用性、可读性和可维护性。本文将介绍 C# 中常见的几种设计模式,并提供相应的示例代码。 工厂模式 工厂模式是一种创建型设计模式,…...
promethues/servicemonitor
目录 1.promethues 能保证源源不断地采集/metrics 信息吗?每次都是最新的吗 2.部署servicemonitor 的作用是什么? 3.pod 部署采集数据直接上报promthues ,不通过servicemonitor 可以吗? 4.你说的"此外,如果部署…...
postman使用简介
1、介绍 postman是一款功能强大的网页调试和模拟发送HTTP请求的Chrome插件,支持几乎所有类型的HTTP请求 2、下载及安装 官方文档:https://www.getpostman.com/docs/v6/ chrome插件:chrome浏览器应用商店直接搜索添加即可(需墙&…...
TikTok评论采集终极指南:3步获取完整评论数据的简单方法
TikTok评论采集终极指南:3步获取完整评论数据的简单方法 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 还在为手动复制TikTok评论而烦恼吗?想要分析热门视频的用户反馈却无从下手&a…...
如何高效调试硬件设备:SSCom串口调试助手让你的Linux/Mac开发更简单
如何高效调试硬件设备:SSCom串口调试助手让你的Linux/Mac开发更简单 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom 你是否曾经在调试嵌入式设备时,因为找不到合适的串口工具而烦恼&…...
深入Linux内核:SysRq‘魔法键’的驱动实现与串口触发机制剖析
Linux内核魔法键:SysRq机制的深度实现与串口调试实战 在嵌入式Linux开发中,当系统出现严重故障甚至完全冻结时,传统调试手段往往束手无策。此时,SysRq(System Request)功能就像一把瑞士军刀,为…...
STM32F103的Flash读写,你踩过这几个坑吗?从解锁失败到数据错乱的避坑实录
STM32F103的Flash读写,你踩过这几个坑吗?从解锁失败到数据错乱的避坑实录 第一次在STM32F103上操作Flash时,我天真地以为这不过是几个寄存器配置和地址访问的问题。直到深夜调试时遇到第一个HardFault,我才意识到自己掉进了开发者…...
HsMod炉石传说插件终极指南:55项功能完全解锁
HsMod炉石传说插件终极指南:55项功能完全解锁 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说多功能增强插件,为玩家提供游戏…...
如何在Linux系统上使用SOLIDWORKS:完整指南与Wine兼容层解决方案
如何在Linux系统上使用SOLIDWORKS:完整指南与Wine兼容层解决方案 【免费下载链接】SOLIDWORKS-for-Linux This is a project, where I give you a way to use SOLIDWORKS on Linux! 项目地址: https://gitcode.com/gh_mirrors/so/SOLIDWORKS-for-Linux 你是…...
如何3步掌握图表数据提取:WebPlotDigitizer让科研数据重获新生
如何3步掌握图表数据提取:WebPlotDigitizer让科研数据重获新生 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 你是否曾面对…...
AI模型版本管理失控真相(2026奇点大会闭门报告首曝:92%团队仍在用传统Git硬扛LLM微调)
更多请点击: https://intelliparadigm.com 第一章:AI原生版本控制:2026奇点智能技术大会Git for AI最佳实践 在2026奇点智能技术大会上,Git for AI正式成为AI工程化基础设施的核心组件。与传统Git不同,AI原生版本控制…...
3个意想不到的技巧:彻底解决Mac上NTFS硬盘的读写难题
3个意想不到的技巧:彻底解决Mac上NTFS硬盘的读写难题 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and management for…...
开发AI应用时如何借助Taotoken实现模型故障的自动容灾
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发AI应用时如何借助Taotoken实现模型故障的自动容灾 在构建依赖大模型能力的AI应用时,服务连续性是一个关键考量。单…...
