Lambda表达式是一种可以在代码中定义匿名函数的方式,通常用于简化代码,使其更紧凑和易读。它的语法如下:
[capture](parameters) -> return_type { body }
下面逐个解释每个部分:
1. 捕获列表 (capture)
捕获列表用于指定哪些外部变量可以在lambda表达式中使用。捕获列表可以有以下几种方式:
[ ]
:不捕获任何变量。[=]
:按值捕获外部作用域中所有变量。[&]
:按引用捕获外部作用域中所有变量。[this]
:按引用捕获当前类的this
指针(用于成员函数中)。[变量名]
:按值捕获指定的变量。[&变量名]
:按引用捕获指定的变量。
2. 参数列表 (parameters)
参数列表与普通函数的参数列表类似,指定lambda表达式可以接受的参数。
3. 返回类型 (return_type)
返回类型是可选的,如果省略,编译器会自动推断返回类型。如果需要显式指定返回类型,可以使用 ->
符号。
4. 函数体 (body)
函数体是lambda表达式的主要部分,包含要执行的代码。
例子
让我们通过几个例子来理解lambda表达式的使用:
示例1:简单的lambda表达式
auto add = [](int a, int b) -> int {return a + b;
};int result = add(3, 4); // result 为 7
这个lambda表达式定义了一个匿名函数,它接受两个整数参数 a
和 b
,返回它们的和。这个匿名函数被赋值给变量 add
,然后可以像普通函数一样调用。
示例2:捕获外部变量
int x = 10;
int y = 20;auto sum = [x, &y](int z) {return x + y + z;
};int result = sum(5); // result 为 35,因为 10 + 20 + 5 = 35
在这个例子中,lambda表达式捕获了外部变量 x
和 y
。x
是按值捕获的,y
是按引用捕获的,所以 y
在lambda表达式中可以修改。
示例3:在标准库算法中使用lambda表达式
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> nums = {1, 2, 3, 4, 5};int sum = 0;std::for_each(nums.begin(), nums.end(), [&sum](int num) {sum += num;});std::cout << "Sum: " << sum << std::endl; // 输出 Sum: 15return 0;
}
在这个例子中,lambda表达式被传递给 std::for_each
算法,用于遍历向量 nums
中的每个元素,并将每个元素的值累加到外部变量 sum
中。
总结
Lambda表达式在C++中是一种强大的工具,可以让代码更加简洁和灵活。它们尤其适用于需要定义短小的匿名函数的场景,比如在标准库算法中传递自定义操作。在学习和使用lambda表达式时,理解捕获列表和参数列表的使用是关键。