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

C++ Lambda表达式:高效编程利器

好的,我们来详细讲解一下 C++ 中的匿名函数,也就是 Lambda 表达式。

Lambda 表达式提供了一种在代码中直接定义和使用小型、未命名函数对象(仿函数)的便捷方式。它特别适用于需要将函数作为参数传递的场景,例如在 STL 算法(如std::sort,std::for_each,std::transform)中。

基本语法

一个 Lambda 表达式的基本形式如下:

[capture-list] (parameters) -> return-type { // 函数体 }

其中:

  1. [capture-list](捕获列表):指定 Lambda 函数体可以访问哪些外部作用域(定义 Lambda 的那个作用域)中的变量。可以是值捕获、引用捕获或不捕获任何变量。
    • []:不捕获任何外部变量。
    • [=]:以值(拷贝)的方式捕获所有外部变量。
    • [&]:以引用方式捕获所有外部变量。
    • [var]:仅以值方式捕获变量var
    • [&var]:仅以引用方式捕获变量var
    • [this]:捕获当前对象(*this)的指针。允许访问当前类的成员变量和函数。
    • 可以组合,例如[=, &y]表示以值方式捕获所有变量,但变量y以引用方式捕获。
  2. (parameters)(参数列表):和普通函数的参数列表一样。如果没有参数,可以省略()
  3. -> return-type(返回类型):指定 Lambda 表达式的返回类型。如果函数体只包含一个return语句,或者没有返回值(void),编译器可以推导出返回类型,这时可以省略-> return-type
  4. { ... }(函数体):Lambda 要执行的代码块。

示例

示例 1:基本用法
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 5, 3, 4, 2}; // 使用 Lambda 作为 std::sort 的比较函数,按降序排序 std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a > b; // 返回类型 bool 可推导 }); // 使用 Lambda 配合 std::for_each 打印每个元素 std::for_each(numbers.begin(), numbers.end(), [](int n) { std::cout << n << " "; }); // 输出: 5 4 3 2 1 return 0; }

https://weibo.com/tv/show/1034:5275135490588709
https://weibo.com/tv/show/1034:5275135444451343
https://weibo.com/tv/show/1034:5275135406440461
https://weibo.com/tv/show/1034:5275135364759554
https://weibo.com/tv/show/1034:5275135322554380

示例 2:捕获外部变量
#include <iostream> int main() { int base = 10; // 值捕获 base auto addBaseByValue = [base](int x) -> int { // base++; // 错误!值捕获的变量在 Lambda 内部是 const 的,默认不可修改 return x + base; }; // 引用捕获 base auto addBaseByRef = [&base](int x) -> int { base++; // 可以修改,因为捕获的是引用 return x + base; }; std::cout << addBaseByValue(5) << std::endl; // 输出: 15 std::cout << "base after byValue: " << base << std::endl; // 输出: 10 (未变) std::cout << addBaseByRef(5) << std::endl; // 输出: 16 (base 先自增为 11, 然后 11+5=16) std::cout << "base after byRef: " << base << std::endl; // 输出: 11 (被修改) }

https://weibo.com/tv/show/1034:5275135490588709
https://weibo.com/tv/show/1034:5275135444451343
https://weibo.com/tv/show/1034:5275135406440461
https://weibo.com/tv/show/1034:5275135364759554
https://weibo.com/tv/show/1034:5275135322554380

示例 3:使用mutable修改值捕获的变量

默认情况下,值捕获的变量在 Lambda 内部是const的。如果需要修改值捕获变量的副本,需要在参数列表后使用mutable关键字。注意:这修改的是 Lambda 内部副本,不会影响外部变量。

#include <iostream> int main() { int count = 0; // 值捕获 count,并使用 mutable 允许修改内部副本 auto increment = [count]() mutable { count++; // 修改内部副本 std::cout << "Inside Lambda: count = " << count << std::endl; }; increment(); // 输出: Inside Lambda: count = 1 increment(); // 输出: Inside Lambda: count = 2 std::cout << "Outside: count = " << count << std::endl; // 输出: Outside: count = 0 (外部未变) }

https://weibo.com/tv/show/1034:5275135490588709
https://weibo.com/tv/show/1034:5275135444451343
https://weibo.com/tv/show/1034:5275135406440461
https://weibo.com/tv/show/1034:5275135364759554
https://weibo.com/tv/show/1034:5275135322554380

示例 4:显式指定返回类型

当 Lambda 函数体包含多个return语句,且返回类型不一致或编译器难以推导时,需要显式指定返回类型。

#include <iostream> int main() { auto complexReturn = [](int x) -> double { if (x > 0) { return static_cast<double>(x) * 1.5; // 返回 double } else { return 0; // 返回 int (0 可隐式转 double) } }; std::cout << complexReturn(10) << std::endl; // 输出: 15 std::cout << complexReturn(-5) << std::endl; // 输出: 0 }

说明

  1. 类型:每个 Lambda 表达式都有一个唯一的、未命名的类型。通常我们使用auto来存储 Lambda 表达式,或者将其作为模板参数传递给期望函数对象的函数(如 STL 算法)。
  2. 性能:Lambda 表达式通常会被编译器内联优化,因此它们在使用上通常比显式定义的函数对象更高效。
  3. 用途:除了 STL 算法,Lambda 还常用于事件处理、回调函数、线程创建(例如std::thread的构造函数)等场景。

希望这个解释能帮助你理解 C++ 的 Lambda 表达式。

http://www.jsqmd.com/news/461018/

相关文章:

  • C++进阶:从C到C++的完美过渡
  • 2026年口碑好的PTFE滤袋公司推荐:针刺毡PTFE滤袋实力厂家推荐 - 品牌宣传支持者
  • 宝鸡钛棒源头厂家/宝鸡钛棒现货工厂怎么挑?2026宝鸡钛合金棒厂家推荐:宝鸡鹰翔钛业,源头厂家实力供应 - 栗子测评
  • 精选2026宝鸡纯钛棒厂家推荐/TC4钛棒生产厂家推荐:宝鸡鹰翔钛业生产厂家直供 - 栗子测评
  • 精选2026甲基丙基酰氧基硅烷供应商/烷基硅烷生产厂家:杭州杰西卡,源头直供与定制化方案 - 栗子测评
  • “现代战争”天梯赛习题
  • 2026纳米二氧化钛厂家|二氧化钛分散液源头厂家-优选宁波极微纳 - 栗子测评
  • Flutter 三方库 commander_ui 的鸿蒙化适配指南 - 构建大屏控制台风格 UI、支持指令式交互与极客风格面板
  • 宿舍管理系统厂家怎么选?2026学生宿舍管理系统推荐:掌门物联科技-创新校园住宿管理智能化新体验 - 栗子测评
  • 学生公寓门锁哪家好?2026掌门物联科技:用智慧公寓系统打造住宿管理新生态 - 栗子测评
  • 高校智能锁哪家好?2026精选优质校园安全出入管理系统厂家:掌门物联科技铸造校园安全出入防线 - 栗子测评
  • 环氧树脂地坪批发怎么选?2026年优质供应商实力解析 - 2026年企业推荐榜
  • 琴房预约系统哪家好?2026掌门物联科-专业琴房管理系统厂家,打造校园琴房智能管理新方式 - 栗子测评
  • STM32——FreeRTOS - 基础
  • 2026KH-550/KH-560/KH-570偶联剂生产厂家:杭州杰西卡-用品质铸造口碑 - 栗子测评
  • 2026校园门锁哪家好?校园智能门锁厂家?掌门物联科技-打造专业校园无线智能锁品牌,铸造安全防线 - 栗子测评
  • 2026年热门的电厂PPS滤袋厂家推荐:电厂PPS滤袋销售厂家推荐 - 品牌宣传支持者
  • 2026年3月湖北环氧地坪厂家实力盘点与选购指南 - 2026年企业推荐榜
  • L3-010 是否完全二叉搜索树 - 题解与完整代码
  • OpenClaw变现实录:从“养龙虾“到可持续盈利的实践指南
  • L3-040 人生就像一场旅行 - 题解与完整代码
  • 2026年湖北力矩限制器实力厂家全景扫描与深度解析 - 2026年企业推荐榜
  • 桌面通用(全架构)【IE浏览器内核插件与 Chrome 内核浏览器插件的区别及兼容性分析】技术文章
  • 2026年武汉平移门选购指南:五大服务商深度解析 - 2026年企业推荐榜
  • 服务器通用(全架构)【服务器存储系统原理与运维实践解析】技术文章
  • 2026年知名的奶油风全屋定制品牌推荐:秦皇岛新中式全屋定制精选厂家 - 品牌宣传支持者
  • 服务器通用(全架构)【页缓存(Page Cache)原理与运维实践分析】技术文章
  • 2026年初环氧地坪漆直销厂家测评:谁值得信赖? - 2026年企业推荐榜
  • 2026年湖北卷帘门选购指南:专业平台与优质服务商解析 - 2026年企业推荐榜
  • 2026年武汉租车市场专业连锁店深度评测与选型指南 - 2026年企业推荐榜