c++ lambda表达式
C++ 中的 Lambda 表达式是一种匿名函数对象,允许你在需要的地方定义轻量级的临时函数,无需显式命名。它在现代 C++ 中被广泛用于简化代码,特别是作为回调函数或算法的参数。
基本语法
[capture](parameters) -> return_type { body }
[capture]:捕获列表,用于访问外部变量。(parameters):参数列表(可选)。-> return_type:返回类型(可选,可自动推导)。{ body }:函数体。
捕获列表 [capture]
控制如何从外部作用域获取变量:
- 值捕获:
[x](复制变量)。 - 引用捕获:
[&x](引用变量)。 - 隐式捕获:
[=](值捕获所有变量)、[&](引用捕获所有变量)。 - 混合捕获:
[&, x](默认引用,x值捕获)、[=, &x](默认值,x引用捕获)。
示例
1. 无参数、无捕获
auto greet = []() { std::cout << "Hello, Lambda!"; };
greet(); // 输出: Hello, Lambda!
2. 带参数和返回值
auto add = [](int a, int b) -> int { return a + b; };
std::cout << add(3, 4); // 输出: 7
3. 捕获外部变量
int x = 10;
auto multiply = [x](int a) { return a * x; };
std::cout << multiply(5); // 输出: 50(捕获了 x=10)
4. 引用捕获
int count = 0;
auto increment = [&count]() { count++; };
increment();
std::cout << count; // 输出: 1(修改了外部变量)
5. 作为算法参数
std::vector<int> nums = {1, 2, 3, 4};
std::for_each(nums.begin(), nums.end(), [](int num) {
std::cout << num << " "; // 输出: 1 2 3 4
});
6. 复杂示例:排序自定义比较
std::vector<std::string> words = {"apple", "banana", "cherry"};
std::sort(words.begin(), words.end(),
[](const std::string& a, const std::string& b) {
return a.size() < b.size(); // 按字符串长度排序
});
// words 现在是: {"apple", "cherry", "banana"}
关键点
-
返回类型推导:如果省略
-> return_type,编译器会自动推导返回类型。auto sum = [](int a, int b) { return a + b; }; // 返回 int -
可变 Lambda:使用
mutable允许修改值捕获的变量(仅在 Lambda 内部有效)。int x = 5; auto modify = [x]() mutable { x++; }; // 允许修改 x 的副本 -
泛型 Lambda(C++14+):使用
auto参数创建模板化函数。auto concat = [](auto a, auto b) { return a + b; }; std::cout << concat(1, 2); // 输出: 3 std::cout << concat("a", "b"); // 输出: ab
适用场景
- 简化回调函数(如
std::sort、std::for_each)。 - 实现简单的闭包逻辑。
- 避免为一次性函数命名。
注意事项
- 生命周期问题:引用捕获时需确保被引用的变量在 Lambda 执行时仍然有效。
- 性能:值捕获会复制变量,大型对象建议使用引用捕获。
Lambda 表达式是 C++ 中强大且灵活的特性,能显著提升代码的可读性和简洁性。

浙公网安备 33010602011771号