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

C++笔记 Lambda表达式

Lambda表达式是C11引入的核心特性之一本质是一种匿名函数可以捕获作用域内的变量无需单独定义函数名就能实现简洁、灵活的代码编写尤其适合作为回调函数、算法参数如STL算法等场景大幅提升代码可读性和开发效率。一、Lambda表达式的核心作用Lambda的核心价值的是“轻量、匿名、可捕获”解决了传统函数的两个痛点无需单独定义函数尤其是只使用一次的简单逻辑减少代码冗余可以直接捕获当前作用域的变量局部变量、类成员等无需通过参数传递简化逻辑。最常见的使用场景配合STL算法如sort、for_each、多线程回调如thread、async、条件变量的wait条件判断等。二、Lambda表达式的语法结构必背Lambda的语法格式固定核心由5部分组成其中只有“函数体”是必须的其余部分可根据需求省略[捕获列表] (参数列表) mutable noexcept -gt; 返回值类型 { 函数体; }1. 各部分详解从左到右1捕获列表 [ ]最关键部分控制Lambda能否访问外部变量捕获列表用于指定“Lambda能使用哪些外部变量”有5种常见写法必须牢记捕获方式语法说明空捕获[]不捕获任何外部变量Lambda内部只能使用自身参数和全局变量值捕获[var1, var2]捕获指定变量var1、var2拷贝一份到Lambda内部默认不可修改除非加mutable引用捕获[var1, var2]捕获指定变量的引用Lambda内部操作会直接修改外部变量注意变量生命周期避免悬空引用值捕获所有变量[]捕获当前作用域所有外部变量均为值拷贝默认不可修改引用捕获所有变量[]捕获当前作用域所有外部变量均为引用可修改外部变量注意捕获列表不能混合冲突比如[, var]是允许的所有变量值捕获唯独var引用捕获但[, var]也是允许的所有变量引用捕获唯独var值捕获但[, ]、[var, ]是错误的。2参数列表 ( )和普通函数的参数列表一致用于接收外部传递给Lambda的参数语法和普通函数完全相同可省略当无参数时。// 无参数可省略() auto func1 [] { cout 无参数Lambda endl; }; // 有参数和普通函数一致 auto func2 [](int a, int b) { return a b; };3mutable可选解除值捕获的“只读限制”值捕获的变量默认在Lambda内部是“只读”的无法修改加上mutable后允许修改Lambda内部的拷贝不会影响外部原变量。int x 10; // 错误值捕获x默认不可修改 // auto func [x] { x; }; // 正确加mutable可修改内部拷贝 auto func [x]() mutable { x; cout 内部x x endl; }; func(); // 输出内部x11 cout 外部x x endl; // 输出外部x10原变量未变4noexcept可选声明Lambda不会抛出异常和普通函数的noexcept作用一致用于告诉编译器Lambda内部不会抛出异常可提升性能尤其在多线程、STL算法中常用。auto func [](int a) noexcept { return a * 2; };5返回值类型 - 类型可选编译器可自动推导如果Lambda函数体只有一条return语句编译器会自动推导返回值类型可省略“- 返回值类型”如果函数体有多条语句且有返回值必须显式指定返回值类型。// 自动推导返回值int可省略- int auto add [](int a, int b) { return a b; }; // 必须显式指定返回值否则编译错误 auto func [](int a) - double { if (a 0) return 1.0; else return 0.5; };6函数体 { }Lambda的核心逻辑和普通函数的函数体一致可编写任意合法的C代码可使用捕获的变量、参数列表中的参数。三、Lambda表达式的基本使用示例示例1基础用法无捕获、有参数、自动推导返回值#include iostream using namespace std; int main() { // 定义Lambda计算两个数的和 auto add [](int a, int b) { return a b; }; // 调用Lambda和调用普通函数一样 int result add(3, 5); cout 3 5 result endl; // 输出3 5 8 return 0; }示例2捕获外部变量值捕获引用捕获#include iostream using namespace std; int main() { int x 10, y 20; // 值捕获x引用捕获y auto func [x, y]() { // x是值拷贝不可修改无mutabley是引用可修改 // x; // 错误值捕获默认只读 y; cout 内部x x , 内部y y endl; }; func(); // 输出内部x10, 内部y21 cout 外部x x , 外部y y endl; // 输出外部x10, 外部y21 return 0; }示例3配合STL算法最常用场景Lambda最常用的场景就是作为STL算法的参数替代繁琐的函数对象或全局函数。#include iostream #include vector #include algorithm using namespace std; int main() { vectorint vec {3, 1, 4, 1, 5, 9}; // 1. 用Lambda排序降序 sort(vec.begin(), vec.end(), [](int a, int b) { return a b; // 降序排序规则 }); // 2. 用Lambda遍历输出 for_each(vec.begin(), vec.end(), [](int val) { cout val ; }); // 输出9 5 4 3 1 1 return 0; }示例4配合多线程回调函数#include iostream #include thread using namespace std; int main() { int num 0; // 引用捕获num在子线程中修改 thread t([num]() { for (int i 0; i 10000; i) { num; } }); t.join(); // 等待子线程结束 cout num num endl; // 输出num 10000 return 0; }四、Lambda表达式的注意事项面试高频1. 捕获变量的生命周期问题重点坑引用捕获的变量Lambda内部持有变量的引用如果外部变量生命周期结束比如出作用域销毁Lambda再访问该引用会导致悬空引用程序崩溃。// 错误示例引用捕获局部变量变量销毁后Lambda访问悬空引用 auto getFunc() { int x 10; return [x]() { cout x endl; }; // x是局部变量出函数销毁 } int main() { auto func getFunc(); func(); // 崩溃访问悬空引用 return 0; }解决方案如果Lambda要在外部使用优先使用值捕获拷贝一份不受外部变量生命周期影响。2. Lambda的本质是“函数对象”Lambda在编译时会被编译器自动转换为一个“匿名的函数对象”也叫仿函数因此Lambda可以赋值给std::functionC11的函数包装器方便存储和传递。#include functional #include iostream using namespace std; int main() { // Lambda赋值给function functionint(int, int) add [](int a, int b) { return a b; }; cout add(2, 3) endl; // 输出5 return 0; }3. 捕获列表不能捕获全局变量、静态变量全局变量、静态变量属于全局作用域Lambda内部可以直接访问无需在捕获列表中声明捕获列表只用于捕获“局部变量”。#include iostream using namespace std; int g_val 100; // 全局变量 int main() { static int s_val 200; // 静态变量 // 无需捕获直接访问全局变量、静态变量 auto func []() { cout 全局变量 g_val endl; cout 静态变量 s_val endl; }; func(); // 正常输出全局变量100 静态变量200 return 0; }4. mutable的作用范围mutable只允许修改“值捕获”的拷贝不会影响外部原变量引用捕获的变量即使不加mutable也可以修改因为引用本身就是直接操作原变量。5. Lambda不能递归调用除非借助std::functionLambda是匿名函数自身无法直接调用自己如果需要递归必须先将Lambda赋值给std::function再在函数体中调用该function。#include functional #include iostream using namespace std; int main() { // 先声明function再赋值Lambda functionint(int) factorial; factorial [factorial](int n) { return n 1 ? 1 : n * factorial(n - 1); }; cout factorial(5) endl; // 输出1205的阶乘 return 0; }五、Lambda表达式的核心总结笔记直接抄Lambda是C11匿名函数核心语法[捕获列表](参数列表) mutable noexcept - 返回值类型 {函数体;}捕获列表是核心分5种[]、[var]、[var]、[]、[]不可混合冲突值捕获默认只读需修改内部拷贝加mutable引用捕获需注意变量生命周期返回值可自动推导单条return多条return需显式指定最常用场景STL算法参数、多线程回调、简单逻辑的临时函数本质是函数对象可赋值给std::function支持递归需借助function。Lambda的核心优势是“简洁、灵活”能大幅简化代码尤其在需要临时函数的场景中替代传统函数或函数对象提升代码可读性和开发效率是C多线程、STL开发的必备技能。

相关文章:

C++笔记 Lambda表达式

Lambda表达式是C11引入的核心特性之一,本质是一种匿名函数,可以捕获作用域内的变量,无需单独定义函数名,就能实现简洁、灵活的代码编写,尤其适合作为回调函数、算法参数(如STL算法)等场景&#…...

网站建设时如何考虑 SEO 因素_如何做好 SEO 竞争对手分析

网站建设时如何考虑 SEO 因素 在现代数字化商业环境中,网站建设不仅仅是一个静态的存在,而是一个动态、竞争激烈的市场。为了在这个竞争中脱颖而出,考虑 SEO 因素是至关重要的。SEO(搜索引擎优化)不仅能够提升网站的可…...

python docker

# Python与Docker:从代码到容器的旅程 在软件开发的世界里,我们常常会遇到这样的场景:代码在开发者的笔记本电脑上运行得完美无缺,但一旦部署到服务器上,就会出现各种莫名其妙的问题。可能是操作系统版本不同&#xff…...

JAVA打车小程序实现原理及开源uniapp代码片段

JAVA打车小程序实现原理打车小程序的核心功能包括用户端、司机端和后台管理系统。用户端实现叫车、订单管理、支付等功能;司机端实现接单、导航、收益管理等功能;后台管理系统负责订单监控、用户管理、数据统计等。用户端功能模块包括地图定位、路线规划…...

python pex

## 聊聊Python的PEX:一个被低估的打包工具 在Python的世界里,打包和分发一直是个让人头疼的问题。传统的pip install虽然方便,但在某些场景下,比如需要快速部署、环境隔离或者离线分发时,就显得有些力不从心了。这时候…...

【12.MyBatis源码剖析与架构实战】9.1 ⼆级缓存的原理

二级缓存(L2 Cache)是计算机体系结构中的关键组件,位于一级缓存(L1)和主内存之间,用于弥合CPU与内存之间的速度差异。下面详细解析其原理,并配合流程图说明数据访问流程。 一、二级缓存的核心原理 1. 存储层次定位 L1缓存:极快(~1ns),极小(32-64KB),与CPU核心紧…...

快速掌握QQ空间历史说说备份:GetQzonehistory完整使用教程

快速掌握QQ空间历史说说备份:GetQzonehistory完整使用教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾经担心QQ空间里的珍贵记忆会随着时间流逝而消失&#xff…...

002.计算机视觉与目标检测发展简史:从传统方法到深度学习

上周调一个老项目,客户要求在不升级硬件的前提下提升夜间车辆检测的准确率。打开代码一看,好家伙,全是手工设计的HOG特征SVM分类器,夜间噪点多的时候误检率直接飙到40%以上。我盯着那些精心调参的边缘梯度直方图代码,突…...

告别英雄联盟繁琐操作:3大核心功能让你轻松掌控游戏节奏

告别英雄联盟繁琐操作:3大核心功能让你轻松掌控游戏节奏 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联盟对局中…...

两相交错并联同步整流双向Buck Boost变换器仿真研究

两相交错并联同步整流双向Buck Boost变换器仿真 所有开关管均可实现ZVs软开关 Buck模式 输入:200-360VDC 额定280VDC 输出:140VDC 10A 开关频率:10kHz Boost模式: 输入:120-160VDC 额定140VDC 输出:280VDC…...

BetterJoy全场景应用指南:从问题诊断到多设备协同的完整解决方案

BetterJoy全场景应用指南:从问题诊断到多设备协同的完整解决方案 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gi…...

Win11Debloat:三分钟搞定Windows 11系统瘦身与隐私保护

Win11Debloat:三分钟搞定Windows 11系统瘦身与隐私保护 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and c…...

高温车间降温妙招:蒸发冷省电空调成关键词解决方案

在高温车间工作,闷热的环境不仅影响员工的工作效率,还可能对身体健康造成威胁。因此,为高温车间找到合适的降温方案至关重要。而蒸发冷省电空调,正是解决这一难题的理想选择。蒸发冷省电空调采用先进的制冷技术,通过压…...

Go语言的命令行工具:从flag到cobra

Go语言的命令行工具:从flag到cobra 1. 引言 命令行工具是软件开发中不可或缺的一部分,它们可以帮助我们自动化任务、管理系统、处理数据等。Go语言以其简洁的语法和强大的标准库,成为了开发命令行工具的理想选择。从基础的flag包到高级的co…...

OpCore-Simplify:黑苹果智能配置工具如何化繁为简?

OpCore-Simplify:黑苹果智能配置工具如何化繁为简? 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 为什么黑苹果配置总是让人望…...

如何快速提升Windows性能:Win11Debloat一键优化指南

如何快速提升Windows性能:Win11Debloat一键优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and cust…...

告别90%重复操作:XHS-Downloader如何重构小红书内容采集体验

告别90%重复操作:XHS-Downloader如何重构小红书内容采集体验 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链…...

C++ 文件 IO 性能优化技巧

C文件IO性能优化技巧 在软件开发中,文件IO操作往往是性能瓶颈之一,尤其是处理大文件或高频读写时。C作为一门高性能语言,提供了多种优化文件IO的方法,合理运用这些技巧可以显著提升程序效率。本文将介绍几种实用的C文件IO性能优化…...

C# OPC连接方式实现上位机与PLC的通用通讯源码分享

C#连接OPC C#上位机链接PLC程序源码 1.该程序是通讯方式是CSharp通过OPC方式连接PLC,用这种方式连PLC不用考虑什么种类PLC,只要OPC服务器里有的PLC都可以连。 2.该资料包含程序,还有一些学习资料。C# 与 OPC 自动化接口深度实践&#xff1a…...

C#基于S7.Net组件实现西门子PLC通信上位机功能说明

C#与西门子plc通讯上位机 c#软件 工控软件 1.该程可以实现CSharp与西门子全系列plc(200,200smart,300,1200,1500)的以太网s7通讯,通讯传输快稳定。 2.该程序采用s7以太网通讯方式,本人经过几个星期的测试&…...

MATLAB连续潮流程序:IEEE节点标准PV曲线绘制工具,支持14节点与33节点系统,具备分...

matlab连续潮流程序绘制PV曲线 静态电压稳定 该程序为连续潮流IEEE14节点和33节点的程序 运行出来有分岔点和鼻点 可移植性强,注释详细 这段程序主要是用来计算电力系统中的潮流分布,并绘制PV曲线。下面我将对程序进行详细的分析。首先,程序开…...

[具身智能-239]:OpenCV 与深度神经网络:两种计算机视觉哲学的深度对比

📊 OpenCV 与深度神经网络:两种计算机视觉哲学的深度对比这张表格精准地拆解了计算机视觉领域两大核心技术范式的底层逻辑差异,本质是 **「物理规则驱动」与「数据特征驱动」** 两种认知世界方式的碰撞。一、核心维度对比解读表格维度OpenCV …...

Python flask django美容美发商城系统

目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析预约与订单管理支付与营销系统后台管理模块技术实现建议扩展功能(可选)项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本…...

Zotero Duplicates Merger:5分钟实现文献库高效整理的终极指南

Zotero Duplicates Merger:5分钟实现文献库高效整理的终极指南 【免费下载链接】ZoteroDuplicatesMerger A zotero plugin to automatically merge duplicate items 项目地址: https://gitcode.com/gh_mirrors/zo/ZoteroDuplicatesMerger 还在为学术文献库中…...

高数赋能编程:从理论到实战的跨界应用,你知道高等数学你一直学的是什么吗?

要理解高等数学在编程开发中的价值,首先需要解构一个普遍的学生困惑:“我学编程,为什么要学高数?” 事实上,高数不是孤立的抽象理论,而是现代计算机科学的思维基座和解决问题的工具库。 它从离散世界&…...

RAG系统提示词重构核心要点,深度拆解核心问题架构与应对方案,实战演练

将针对企业级应用优化的Prompt工程方法论迁移至RAG(检索增强生成)系统时,需要进行系统性的范式重构。这并非简单的指令复用,而是涉及从单体模型指令到“检索-生成”双阶段协同的体系升级。 问题解构与核心挑战 企业级RAG系统引入…...

黑苹果配置终极指南:用OpCore-Simplify工具30分钟搞定OpenCore EFI

黑苹果配置终极指南:用OpCore-Simplify工具30分钟搞定OpenCore EFI 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置…...

从Prompt到Context到Harness:AI工程的三次范式转移,第三次正在发生

2026年初,Anthropic 和 OpenAI 几乎同一周发了各自关于 Harness Engineering 的实践文章。加上两篇关于 Agent 记忆基础设施的学术论文,以及社区里关于三代工程范式演进的讨论,一个完整的图景正在浮现 三代工程范式各解决什么问题 2023到202…...

[具身智能-241]:从OpenCV到CNN:人类认知模式在计算机视觉中的投影

人类大脑认知的两种模式:确定性的逻辑推演模式 不确定性的直觉经验模式,前者即“非此即彼的计算机技术”,后者即“数据经验主义的人工智能技术”。 人类的自然语言是模糊的,视觉亦是如此,OpenCV和CNN是这种思维模式的…...

【26大英赛】全国大学生英语竞赛高频核心词汇表pdf电子版(考前必背单词)

2026年全国大学生英语竞赛进入最后冲刺阶段,考试日期定于4月12日。距离考试仅剩6天时间,备考工作刻不容缓。 为助力考生高效复习,现推出最新版竞赛核心词汇手册。该资料以PDF电子版形式提供,支持自由下载和打印使用,方…...