全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ Lambda表达式怎么写_C++11匿名函数语法与捕获列表详解

Lambda表达式是C++11中定义匿名函数的简洁方式,基本语法为[捕获列表](参数列表) mutable 异常属性 -> 返回类型 {函数体},其中捕获列表和函数体必需;捕获列表可按值[x]或按引用[&x]捕获外部变量,也可使用隐式[=]或[&]捕获所有变量,支持混合捕获如[&, x];按值捕获的变量默认只读,加mutable可修改其副本而不影响外部;返回类型通常可自动推导,若函数体复杂需显式声明;常用于STL算法如sort的比较函数或封装回调函数,正确使用能提升代码可读性与效率。

在C++11中,Lambda表达式是一种定义匿名函数的简洁方式,常用于需要传递函数对象的场合,比如STL算法或回调函数。它让代码更紧凑、可读性更强,尤其适合短小逻辑的内联实现。

基本语法结构

Lambda表达式的完整语法如下:

[捕获列表] (参数列表) mutable 异常属性 -> 返回类型 { 函数体 }

其中,只有捕获列表函数体是必需的,其余部分可以省略。编译器通常能自动推导返回类型,因此最常见的写法是:

[capture](parameters) { body }

例如:

auto add = [](int a, int b) {
    return a + b;
};
int result = add(3, 4); // result = 7

捕获列表详解

捕获列表决定Lambda如何访问外部作用域中的变量。它可以按值、按引用捕获,也可以混合使用。

按值捕获 [x]:将变量x的副本传入Lambda,内部修改不会影响外部。

int x = 10;
auto f = [x]() { 
    std::cout << x << std::endl; 
};
x = 20;
f(); // 输出 10,因为捕获的是副本

按引用捕获 [&x]:Lambda内部操作的是原始变量,修改会影响外部。

int x = 10;
auto f = [&x]() { 
    x = 100; 
};
f();
std::cout << x; // 输出 100

隐式捕获

  • [=]:按值捕获所有使用的外部变量
  • [&]:按引用捕获所有使用的外部变量

例如:

int a = 1, b = 2;
auto sum = [=]() { return a + b; };     // 按值捕获 a 和 b
auto incr = [&]() { ++a; ++b; };        // 按引用修改 a 和 b

混合捕获:可以组合使用,比如默认按引用,但某个变量按值。

int x = 10, y = 20;
auto f = [&, x]() {     // y 按引用,x 按值
    std::cout << x + y;
};

注意:不能重复捕获同一个变量,如 [x, x] 是错误的。

mutable关键字与值捕获的修改

默认情况下,按值捕获的变量在Lambda中是只读的(编译器生成的函数调用运算符为const)。如果想修改它们,需加上mutable关键字。

int x = 5;
auto f = [x]() mutable {
    x += 10;
    std::cout << x << std::endl;
};
f();   // 输出 15
std::cout << x; // x 仍是 5,外部未变

加了mutable后,虽然能修改副本,但不影响原变量。

返回类型推导

如果函数体只有一个return语句,编译器能自动推导返回类型。否则需要显式声明。

// 自动推导
auto square = [](int n) { return n * n; };

// 显式指定返回类型 auto divide = [](double a, double b) -> double { if (b != 0) return a / b; return 0; };

实际应用场景

Lambda最常见于STL算法中:

std::vector nums = {5, 2, 8, 1, 9};
std::sort(nums.begin(), nums.end(), [](int a, int b) {
    return a > b; // 降序排序
});

也适用于封装回调:

std::function callback;

int times = 0; callback = [×]() { ++times; std::cout << "Called " << times << " times\n"; };

callback(); // Called 1 times callback(); // Called 2 times

基本上就这些。掌握捕获方式和基本结构,就能写出清晰高效的Lambda表达式。关键是理解值与引用的区别,避免悬空引用或意外修改。


# 回调函数  # c++  # 区别  # 作用域  # 代码可读性  # 运算符  # sort  # 封装  # const  # mutable  # Lambda  # 对象  # 算法  # 的是  # 回调  # 是一种  # 隐式  # 就能  # 适用于  # 也可  # 而不  # 仍是  # 只有一个 


相关文章: 建站之星后台搭建步骤解析:模板选择与产品管理实操指南  制作宣传网站的软件,小红书可以宣传网站吗?  制作网站的软件免费下载,免费制作app哪个平台好?  如何选择可靠的免备案建站服务器?  电商平台网站制作流程,电商网站如何制作?  南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?  如何在建站宝盒中设置产品搜索功能?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何快速搭建高效可靠的建站解决方案?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  Bpmn 2.0的XML文件怎么画流程图  javascript基本数据类型及类型检测常用方法小结  如何用VPS主机快速搭建个人网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  linux top下的 minerd 木马清除方法  名字制作网站免费,所有小说网站的名字?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  营销式网站制作方案,销售哪个网站招聘效果最好?  电商网站制作公司有哪些,1688网是什么意思?  深圳网站制作培训,深圳哪些招聘网站比较好?  建站之星代理如何优化在线客服效率?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  建站主机无法访问?如何排查域名与服务器问题  临沂网站制作公司有哪些,临沂第四中学官网?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何快速重置建站主机并恢复默认配置?  宝塔新建站点报错如何解决?  如何用虚拟主机快速搭建网站?详细步骤解析  如何通过虚拟主机快速完成网站搭建?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  C++如何编写函数模板?(泛型编程入门)  SQL查询语句优化的实用方法总结  建站之星收费标准详解:套餐费用及年费价格表一览  西安大型网站制作公司,西安招聘网站最好的是哪个?  定制建站价位费用解析与套餐推荐全攻略  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法  建站主机CVM配置优化、SEO策略与性能提升指南  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  建站之星好吗?新手能否轻松上手建站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  建站之星导航配置指南:自助建站与SEO优化全解析  如何通过远程VPS快速搭建个人网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  网站制作公司排行榜,抖音怎样做个人官方网站  如何构建满足综合性能需求的优质建站方案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。