Lambda 表达式详细文档
简介
Lambda 表达式是一种匿名函数,允许您在不定义函数的情况下将代码块传递给其他函数或方法。Lambda 表达式通常用于简化代码,并使代码更具可读性。
语法
Lambda 表达式的语法如下:
[capture-list] (parameter-list) -> return-type { body }
详细解释
-
capture-list:捕获列表,用于捕获外部变量,以便 lambda 表达式可以在内部使用它们。捕获列表中的变量可以是值类型或引用类型。
-
捕获方式
- 按值捕获:使用
=
符号将外部变量捕获到 lambda 表达式内部,内部对变量的修改不会影响外部变量的值。 - 按引用捕获:使用
&
符号将外部变量捕获到 lambda 表达式内部,内部对变量的修改会影响外部变量的值。 - 按指针捕获:使用
*
符号将外部变量捕获到 lambda 表达式内部,内部对变量的修改会影响外部变量的值。
- 按值捕获:使用
-
捕获的区别
捕获方式 语法 特点 按值捕获 [x]
创建外部变量的副本,内部修改不影响外部变量 按引用捕获 [&x]
引用外部变量,内部修改影响外部变量 按指针捕获 [*x]
引用外部变量的指针,内部修改影响外部变量
-
-
parameter-list:参数列表,用于定义 lambda 表达式的参数。参数列表中的参数可以是任何类型。
-
return-type:返回值类型,用于定义 lambda 表达式的返回值类型。返回值类型可以是任何类型。
-
body:代码块,用于定义 lambda 表达式的行为。代码块可以包含任何有效的 C++ 代码。
示例
以下是一个 lambda 表达式的示例:
// 定义一个 lambda 表达式,将两个数字相加
auto add = [](int a, int b) { return a + b; };// 调用 lambda 表达式
int result = add(1, 2);// 输出结果
std::cout << result << std::endl; // 输出 3
应用场景
Lambda 表达式可以用在各种场景中,包括:
-
算法:Lambda 表达式可以用在算法中,例如排序、过滤等。
-
示例
// 使用 lambda 表达式对数组进行排序 std::vector<int> numbers = {1, 5, 3, 2, 4}; std::sort(numbers.begin(), numbers.end(), [](int a, int b) { return a < b; });// 输出排序后的结果 for (int num : numbers) {std::cout << num << " "; }// 输出结果 // 1 2 3 4 5
-
-
函数式编程:Lambda 表达式可以用在函数式编程中,例如 map、reduce 等。
-
示例
// 使用 lambda 表达式将数组中的元素平方 std::vector<int> numbers = {1, 2, 3, 4, 5}; std::vector<int> squares = std::transform(numbers.begin(), numbers.end(), [](int num) { return num * num; });// 输出平方后的结果 for (int num : squares) {std::cout << num << " "; }// 输出结果 // 1 4 9 16 25
-
-
事件处理:Lambda 表达式可以用在事件处理中,例如按钮点击事件等。
-
示例
// 使用 lambda 表达式处理按钮点击事件 QPushButton button; button.clicked.connect([]() {std::cout << "Button clicked!" << std::endl; });
-
注意事项
- Lambda 表达式是匿名函数,因此不能直接调用。
- Lambda 表达式不能访问外部变量,除非使用捕获列表。
- Lambda 表达式不能定义自己的成员函数。
总结
Lambda 表达式是一种强大的工具,可以简化代码,并使代码更具可读性。了解 Lambda 表达式的语法、应用场景和注意事项