lambda表达式是C++11引入的匿名函数机制,基本语法为[捕获列表](参数列表) mutable -> 返回类型 { 函数体 },常用于STL算法中简洁定义内联操作。

lambda表达式是C++11引入的一种简洁定义匿名函数的方式,适合在需要函数对象的场合快速编写内联函数。它的基本结构清晰,使用灵活,尤其常用于STL算法中作为谓词或操作函数。
lambda表达式的基本语法
lambda表达式的完整语法如下:
[捕获列表](参数列表) mutable -> 返回类型 { 函数体 }其中各部分说明如下:
- 捕获列表 [ ]:决定如何从外部作用域获取变量,可以按值或引用捕获。
- 参数列表 ( ):和普通函数参数类似,可为空。
- mutable(可选):允许修改按值捕获的变量。
- 返回类型(可选):若不指定,编译器自动推导。
- 函数体 { }:包含具体执行逻辑。
最简单的lambda示例:
立即学习“C++免费学习笔记(深入)”;
auto func = []() { return 42; };std::cout
捕获列表的使用方式
捕获列表控制lambda如何访问外部变量,常见形式有:
- [=]:按值捕获所有外部变量。
- [&]:按引用捕获所有外部变量。
- [x]:仅按值捕获变量x。
- [&x]:仅按引用捕获变量x。
- [this]:捕获当前对象的this指针。
- [=, &x]:按值捕获所有,但x按引用捕获。
示例:使用捕获列表处理局部变量
int a = 10;auto f1 = [a]() { std::cout a = 20;
f1(); // 输出 10,因为是按值捕获
auto f2 = [&a]() { std::cout a = 30;
f2(); // 输出 30,因为是按引用捕获
在STL算法中的实际应用
lambda常用于
例如,对vector
std::sort(nums.begin(), nums.end(), [](int a, int b) {
return a > b;
});
再比如遍历并打印元素:
std::for_each(nums.begin(), nums.end(), [](int n) {std::cout }); // 输出:8 5 2 1
返回类型与mutable关键字
大多数情况下,lambda的返回类型由return语句自动推导。但如果函数体包含多种返回路径,需显式指定返回类型。
auto divide = [](double a, double b) -> double {if (b != 0) return a / b;
else return 0.0;
};
当使用按值捕获时,默认不能修改捕获的变量。加上mutable可解除这一限制:
int x = 1;auto f = [x]() mutable {
x += 10;
std::cout };
f(); // 输出 11
std::cout
基本上就这些。lambda让代码更紧凑,减少额外函数声明,合理使用能显著提升可读性和开发效率。注意生命周期问题,尤其是引用捕获时避免悬空引用。











