C++ Lambda 函数
Lambda 函数
Lambda 函数 是一种小型匿名函数,您可以直接在代码中编写。当您需要一个快速函数而无需单独命名或声明时,它非常有用。
您可以将其视为"即时迷你函数"。
语法
[capture] (parameters) { code };
别担心:我们稍后会解释[capture(捕获)]的含义。现在,我们先用一对空括号代替。
基本 Lambda 示例
这里,message 包含一个 Lambda 函数,该函数会将一条消息打印到屏幕上:
示例
int main() {
auto message = []() {
cout << "Hello
World!
";
};
message();
return 0;
}
结果:
Hello World!
带参数的 Lambda 表达式
您可以像传递普通函数一样,向 Lambda 表达式传递值:
#include <iostream>
using namespace std;
int main() {
auto add = [](int a, int b) {
return a + b;
};
cout << add(3, 4);
return 0;
}
结果:
7
将 Lambda 函数传递给函数
您还可以将 Lambda 函数作为参数传递给另一个函数。
当您想告诉函数"做什么",而不仅仅是"使用什么数据"时,这非常有用。
在下面的示例中,我们将一个小的 Lambda 函数传递给另一个函数,然后该函数会运行它两次:
#include <iostream>
#include <functional> // Needed for std::function
using namespace std;
// 一个以另一个函数作为参数的函数
void myFunction(function<void()> func) {
func();
func();
}
int main() {
auto message = []() {
cout <<
"Hello World!
";
};
myFunction(message);
return 0;
}
结果:
Hello World!
Hello World!
请注意,您必须包含 <functional> 库,此示例才能正常运行。
在循环中使用 Lambda 函数
您可以在循环内部定义和使用 Lambda 函数,这非常适合快速执行操作:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 3; i++) {
auto show = [i]() {
cout << "Number: " << i << "
";
};
show();
}
return 0;
}
结果:
Number: 1
Number: 2
Number: 3
捕获子句 []
您可以使用 [ ] 方括号,使 lambda 表达式能够访问其外部的变量。
这称为捕获子句。
在本例中,lambda 表达式按值捕获变量 x(复制):
注意:该 lambda 表达式使用 x 的副本。如果在定义 lambda 表达式后更改 x,不会影响 lambda 表达式内部的值。
注意:您还可以使用 [&] 来按引用捕获。
按引用捕获
如果您希望 lambda 表达式使用变量的最新值(而不仅仅是副本),您可以使用[&]按引用捕获它。
这意味着 lambda 表达式将使用原始变量,而不是单独的副本:
int main() {
int x = 10;
auto show = [&x]() {
cout << x;
};
x = 20; // 在创建 lambda 函数后更改 x。
show();
return 0;
}
结果:
20
为什么? lambda 函数看到的是原始的 x 变量,所以当你更改 x 时,lambda 函数会使用更新后的值。
普通函数 vs Lambda 函数
普通函数和 Lambda 函数都允许你将代码分组并在稍后运行,但它们的使用场景略有不同。
以下情况请使用普通函数:
- 您计划在多个地方重用该函数
- 您希望为函数指定一个清晰、有意义的名称
- 逻辑冗长或复杂
以下情况请使用 lambda 函数:
- 只需要使用一次该函数
- 代码简洁明了
- 想将一个快速函数传递给另一个函数
这两个例子做的是同一件事:它们都返回两个数的和。
常规函数
int add(int a, int b) {
return a + b;
}
Lambda 函数
auto add = [](int a, int b) {
return a + b;
};
注意: 如果您不需要在以后重用该函数,那么 lambda 表达式非常实用。它速度很快,并且可以很好地用于代码块内或作为其他函数的参数。

