Lambda 表达式是C++11引入的一种简洁定义匿名函数的方法。它们允许你在需要一个函数对象的地方快速定义一个函数,而无需编写完整的函数声明和定义。Lambda 表达式可以捕获其外部作用域中的变量,并可以具有自己的参数列表和函数体。
Lambda 表达式的一般语法结构如下:
[capture](parameters) -> return_type { function_body }
各部分的详细解释:
-
捕获子句
[capture]
:- 用于指定Lambda可以访问哪些外部变量。可以使用以下方式:
- 空捕获
[ ]
:不捕获任何变量。 - 值捕获
[a, b]
:通过值捕获变量a
和b
。 - 引用捕获
[&a, b]
:通过引用捕获变量a
,通过值捕获变量b
。 - 隐式捕获
[=]
:通过值捕获所有外部作用域中的变量。 - 隐式引用捕获
[&]
:通过引用捕获所有外部作用域中的变量。
- 空捕获
- 用于指定Lambda可以访问哪些外部变量。可以使用以下方式:
-
参数列表
(parameters)
:- Lambda可以接受零个或多个参数,参数列表定义了这些参数的类型和名称。如果Lambda不接受参数,可以省略参数列表。
-
返回类型
-> return_type
:- 指定Lambda表达式的返回类型。如果返回类型可以从函数体中推断出来,或者Lambda没有返回语句,可以省略返回类型。
-
函数体
{function_body}
:- Lambda的执行代码块,可以包含任意多的语句。
下面是一个Lambda表达式的示例,它捕获外部变量 i
的引用,接受一个整数参数 elem
,并打印这些值:
int i = 10;
auto lambda = [&i](int elem) {
std::cout << i << " " << elem << std::endl;
};
lambda(20); // 输出: 10 20
Lambda 表达式也可以立即执行,如之前讨论的立即执行的Lambda表达式(Immediately Invoked Lambda Expression,IILE):
[]() {
// 一些代码
}();
这种用法创建了一个不接受参数也不捕获任何外部变量的Lambda表达式,并立即执行它。
Lambda 表达式在C++中的用途非常广泛,包括但不限于:
- 用作STL算法的自定义谓词或比较函数。
- 用作回调函数。
- 作为线程参数启动线程。
- 用于初始化或修改容器中的元素。
Lambda 表达式是现代C++编程中一个非常强大和灵活的特性,它们提供了一种编写简洁、可读性高且功能强大的代码的方法。