Lambda表达式
Lambda表达式是C++ 11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而无需单独命名函数,常用于简化代码、实现回调函数或配合 STL 算法使用。
基本语法结构#
Lambda表达式的基本语法如下:
Copy
| [捕获列表](参数列表) -> 返回类型{ |
| |
| |
| return expression; |
| } |
- 捕获列表(Capture List) :定义Lambda如何访问外部变量。
- 参数列表(Parameter List):与普通函数的参数列表类似。
- 返回类型(Return Type):可省略,由编译器自动推导。
- 函数体(Body):具体的实现逻辑
捕获列表(Capture List)#
捕获列表决定了Lambda如何访问外部作用域的变量:
[]
:不捕获任何外部变量。
[=]
:按值捕获所有外部变量(副本)。
[&]
:按引用捕获所有外部变量。
[var]
:按值捕获特定变量var
。
[&var]
:按引用捕获特定变量var
。
- 混合捕获:例如
[=, &x]
表示按值捕获所有变量,但x
按引用捕获。
示例:
Copy
| int a = 1, b = 2; |
| auto lambda = [a, &b]() { |
| |
| b = a + b; |
| |
| }; |
参数列表与返回类型#
- 参数列表:与普通函数已知,支持默认参数(C++14起)。
- 返回类型:可显式指定(
-> type
),或由return
语句自动推导。
示例:
Copy
| |
| auto add = [](int x, int y) { return x + y; }; |
| |
| |
| auto divide = [](int x, int y) -> double { |
| if (y == 0) return 0.0; |
| return static_cast<double>(x) / y; |
| }; |
mutable关键字#
默认情况下,按值捕获的变量在Lambda内是只读的。若需修改副本,需使用mutable
关键字:
Copy
| int count = 0; |
| auto counter = [count]() mutable { |
| count++; |
| return count; |
| }; |
Lambda的应用场景#
(1)STL排序算法中的谓词#
Copy
| std::vector<int> nums = {3, 1, 4, 1, 5}; |
| |
| std::sort(nums.begin(), nums.end(), [](int a, int b) { |
| return a > b; |
| }); |
(2)异步回调#
Copy
| #include <thread> |
| std::thread t([&]() { |
| |
| }); |
| t.join(); |
(3)简化函数对象#
Copy
| auto print = [](const std::string& msg) { |
| std::cout << msg << std::endl; |
| }; |
| print("Hello, Lambda!"); |
注意事项#
- 生命周期问题:按引用捕获的变量可能在Lambda执行时已销毁,导致未定义行为。
- 性能:Lambda是编译器生成的匿名类对象,小规模使用性能接近普通函数。
- 泛型Lambda(C++14+):支持
auto
参数:
Copy
| auto generic = [](auto x, auto y) { return x + y; }; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)