Lambda表达式是C++11引入的匿名函数特性,语法为[捕获列表](参数)->返回类型{函数体},常用简化形式;可捕获外部变量,用于STL算法等场景。

Lambda表达式是C++11引入的重要特性,它允许你在代码中定义匿名函数,特别适合用在需要传递函数作为参数的场合,比如STL算法。它的语法简洁,能捕获外部变量,使用起来非常灵活。
lambda表达式的基本写法
lambda表达式的完整语法如下:
[捕获列表](参数列表) mutable 异常属性 -> 返回类型 { 函数体 }其中,最常用的是简化形式:
[捕获列表](参数) { 函数体 }说明各部分含义:
立即学习“C++免费学习笔记(深入)”;
- 捕获列表:决定如何访问外部作用域中的变量,如 [=] 值捕获、[&] 引用捕获、[x] 捕获特定变量等
- 参数列表:和普通函数参数类似,可为空
- 函数体:实现具体逻辑
- 返回类型通常可省略,编译器会自动推导
示例:
int x = 10;auto f = [x](int n) { return n + x; };
cout
捕获方式详解
lambda能否访问外部变量取决于捕获列表:
- [=]:以值的方式捕获所有外部变量
- [&]:以引用方式捕获所有外部变量
- [x]:仅值捕获变量x
- [&x]:仅引用捕获变量x
- [this]:捕获当前对象的this指针(在类成员函数中常用)
- [=, &x]:值捕获所有,但引用捕获x
注意:值捕获的变量在lambda创建时就固定了,后续外部修改不影响lambda内部;引用捕获则会反映外部变化。
auto f1 = [a,&b]() { cout a = 10; b = 20;
f1(); // 输出 1,20 —— a是值捕获,b是引用捕获
常见使用场景
lambda最常用于STL算法中替代函数对象或函数指针:
- 排序自定义规则
- 查找满足条件的元素
- 遍历并处理容器元素
示例:对vector按绝对值排序
vectorsort(v.begin(), v.end(), [](int a, int b) {
return abs(a) });
示例:遍历输出
for_each(v.begin(), v.end(), [](int x) {cout });
存储和传递lambda
由于每个lambda表达式生成唯一的匿名类型,不能直接用普通函数指针接收。推荐使用std::function:
#includeusing namespace std;
function
return a > b;
};
sort(v.begin(), v.end(), comp);
也可以用auto保存,但只能在局部作用域使用:
auto myLambda = []() { cout myLambda();基本上就这些。lambda让C++代码更简洁、直观,尤其配合算法使用时大幅提升可读性。掌握捕获机制和基本语法后,就能在日常开发中高效使用。不复杂但容易忽略细节,多写几次就熟练了。











