Lambda表达式是C++中定义匿名函数的简洁方式,基本语法为[捕获列表](参数列表) mutable -> 返回类型 {函数体},其中捕获列表和函数体必选,其余可省略;常用形式如[](){}表示无参无返回值的Lambda;捕获列表控制外部变量访问方式,如[a,&b]表示a值捕获、b引用捕获,配合STL使用可提升代码效率。
在C++中,Lambda表达式是一种定义匿名函数的简便方式,常用于需要传递函数作为参数的场景,比如算法操作或回调处理。它让代码更简洁、直观,特别是在配合STL使用时非常高效。
Lambda表达式的基本语法
一个完整的Lambda表达式由以下几个部分组成:
[捕获列表](参数列表) mutable 异常属性 -> 返回类型 { 函数体 }
其中,只有[捕获列表]和{函数体}是必需的,其余部分可省略。
常见简化形式如下:
立即学习“C++免费学习笔记(深入)”;
[]() { } —— 最简单的Lambda,无参数、无返回值。
各部分说明:
- 捕获列表 []:决定如何从外部作用域获取变量(值捕获或引用捕获)。
- 参数列表 ():像普通函数一样,可以为空或包含多个参数。
- mutable:允许修改通过值捕获的变量。
- -> 返回类型:若不指定,编译器会自动推导返回类型。
- 函数体 {}:执行的具体逻辑。
捕获列表的用法
捕获列表控制Lambda如何访问外部变量,常见形式有:
- []:不捕获任何变量。
- [=]:以值的方式捕获所有外部变量。
- [&]:以引用的方式捕获所有外部变量。
- [x, &y]:x按值捕获,y按引用捕获。
- [this]:捕获当前对象的指针(在类成员函数中使用)。
示例:
int a = 10; int b = 20; auto func = [a, &b]() { std::cout
实际应用场景
Lambda在STL算法中应用广泛,能显著提升代码可读性。
1. 配合 std::sort 使用自定义排序
std::vector
2. 在 std::for_each 中执行操作
std::vector<:string> names = {“Alice”, “Bob”, “Charlie”}; std::for_each(names.begin(), names.end(), [](const std::string& name) { std::cout
3. 作为回调函数
在异步操作或事件处理中,Lambda适合作为临时回调:
std::function
注意事项与技巧
使用Lambda时需注意以下几点:
- 值捕获的变量是副本,修改不会影响原变量(除非加 mutable)。
- 引用捕获要确保变量生命周期长于Lambda,避免悬空引用。
- 返回类型通常可省略,但复杂逻辑中建议显式指定。
- Lambda本身无类型名,需用 auto 或 std::function 存储。
示例:使用 mutable 修改值捕获变量
int counter = 0; auto inc = [counter]() mutable { return ++counter; }; std::cout
基本上就这些。Lambda表达式让C++代码更现代、灵活,掌握其语法和使用场景对写出高效清晰的代码很有帮助。