lamda表达式
全文来自chatgpt
C++ 中的 lambda 表达式(也叫匿名函数)允许我们定义一个匿名的内联函数,它可以在需要函数指针或回调函数的地方使用,而不需要单独定义一个函数。这使得代码更加简洁,尤其是在处理函数对象、回调等场景时。
Lambda 表达式的基本语法
C++11 中引入了 lambda 表达式,其基本语法如下:
1 | [捕获列表](参数列表) -> 返回类型 { 函数体 } |
各部分的含义:
- 捕获列表(Capture List)
[ ]
:- 捕获外部变量以便在 lambda 内部使用。
- 可以指定哪些外部变量应该被传递给 lambda 表达式,或如何传递这些变量(按值、按引用等)。
- 捕获方式:
[ ]
:不捕获任何外部变量。[x]
:按值捕获外部变量x
。[&]
:按引用捕获所有外部变量。[=]
:按值捕获所有外部变量。[=, &x]
:按值捕获所有外部变量,但按引用捕获x
。
- 参数列表:类似于普通函数的参数列表,指定 lambda 表达式接受哪些参数。
- 返回类型(Optional):
- 如果 lambda 表达式有返回值,可以通过
->
指定返回类型。如果返回类型可以由编译器推导出,->
可以省略。
- 如果 lambda 表达式有返回值,可以通过
- 函数体:包含 lambda 的执行代码,定义了函数的具体操作。
示例 1:一个简单的 lambda 表达式
1 |
|
[i]
:按值捕获外部变量i
。lambda
是 lambda 表达式的别名,可以像普通函数一样调用。
示例 2:捕获外部变量按引用
1 |
|
[&i]
:按引用捕获外部变量i
,允许在 lambda 内部修改它。
示例 3:指定参数列表和返回类型
1 |
|
[](int a, int b) -> int
:定义了一个接受两个int
参数并返回int
类型结果的 lambda。
示例 4:没有返回值的 lambda
1 |
|
[]
:不捕获任何外部变量。() -> void
:没有返回值,void
可省略。
示例 5:lambda 作为参数传递
1 |
|
- 这里的
std::for_each
接受一个 lambda 表达式来对每个元素进行操作。
捕获外部变量的方式
-
按值捕获(Pass by Value):
1
2
3int x = 10;
auto lambda = [x]() { std::cout << x << std::endl; };
// 捕获时会将 x 的值拷贝到 lambda 中,lambda 内修改 x 不会影响外部变量 -
按引用捕获(Pass by Reference):
1
2
3int x = 10;
auto lambda = [&x]() { std::cout << x << std::endl; };
// 捕获时会引用外部变量 x,lambda 内修改 x 会影响外部变量 -
捕获所有外部变量(按值或按引用):
[=]
按值捕获所有外部变量。[&]
按引用捕获所有外部变量。
-
混合捕获:
1
2
3
4
5int a = 10, b = 20;
auto lambda = [a, &b]() {
std::cout << "a: " << a << ", b: " << b << std::endl;
};
// 按值捕获 a,按引用捕获 b
小结
C++ 的 lambda 表达式提供了一种简洁的方式来定义匿名函数,可以灵活捕获外部变量并直接在函数体中使用。它广泛应用于 STL 算法、事件处理和回调函数等场景,是现代 C++ 编程中一个非常有用的特性。