Lambda(也称为 lambda 表达式或匿名函数)是 C++11 及其后续版本引入的一种特性,它允许你定义一个匿名的、内联的函数对象(也称为闭包)。Lambda 表达式提供了一种紧凑的方式来表示可以像函数一样调用的代码块,并且这些代码块可以捕获其所在作用域中的变量。
Lambda 表达式的基本语法如下:
[capture](parameters) -> return-type { body } |
capture
:捕获子句,用于指定 lambda 表达式体中可以访问的外部变量。捕获方式可以是值捕获(=
)或引用捕获(&
),或者明确指定要捕获的变量(如[x, &y]
)。如果省略捕获子句,则默认不会捕获任何外部变量。parameters
:参数列表,与普通函数的参数列表类似。return-type
:返回类型,如果 lambda 表达式的返回类型可以从函数体推断出来,则可以省略。body
:lambda 表达式的主体,即要执行的代码块。
在 Linux 环境下使用 C++ 的 lambda 表达式是很常见的,因为 lambda 表达式提供了一种简洁的方式来定义匿名函数对象。下面是一个在 Linux 上使用 C++ 编写,包含 lambda 表达式的简单示例:
首先,你需要一个 C++ 编译器,如 g++
,这是 Linux 系统上常用的 C++ 编译器。
下面是一个简单的示例程序,它使用 std::for_each
算法和 lambda 表达式来遍历一个整数数组并打印每个元素:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// 创建一个整数向量
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 使用 std::for_each 和 lambda 表达式遍历并打印每个元素
std::for_each(numbers.begin(), numbers.end(), [](int num) {
std::cout << num << std::endl;
});
return 0;
}
你可以按照以下步骤来编译和运行这个程序:
- 将上面的代码保存到一个文件中,比如
lambda_example.cpp
。 - 打开终端,导航到保存
lambda_example.cpp
的目录。 - 使用
g++
编译器编译文件:g++ -o lambda_example lambda_example.cpp
。 - 运行编译后的程序:
./lambda_example
。
输出将会是:
1 2 3 4 5
在这个例子中,我们创建了一个包含整数的 std::vector
。然后,我们使用 std::for_each
算法来遍历这个向量的每个元素。std::for_each
的第三个参数是一个函数对象,这里我们使用了一个 lambda 表达式来定义这个函数对象。这个 lambda 表达式接受一个整数作为参数,并打印这个整数。当 std::for_each
遍历向量的每个元素时,它都会调用这个 lambda 表达式,并传入当前的元素作为参数。
在这段代码中,std::for_each
是 C++ 标准库 <algorithm>
中的一个算法,它用于遍历一个范围(比如一个容器的所有元素)并对每个元素执行一个指定的操作。这个操作通常由一个函数对象(比如函数指针、函数对象或 lambda 表达式)来提供。
具体来说,std::for_each
的三个参数是:
numbers.begin()
:表示要遍历的范围的起始迭代器。在这个例子中,它是numbers
向量的开始迭代器。numbers.end()
:表示要遍历的范围的结束迭代器(注意,这个迭代器并不指向范围中的最后一个元素,而是指向范围之后的第一个位置)。在这个例子中,它是numbers
向量的结束迭代器。- 第三个参数是一个函数对象,它定义了要对范围中的每个元素执行的操作。在这个例子中,它是一个 lambda 表达式。
Lambda 表达式 [](int num) { std::cout << num << std::endl; }
的定义如下:
[]
:这是 lambda 表达式的捕获子句。在这个例子中,它是空的,意味着 lambda 表达式不捕获任何外部变量。(int num)
:这是 lambda 表达式的参数列表。它声明了一个名为num
的整数参数,该参数在 lambda 表达式的函数体中可以访问。{ std::cout << num << std::endl; }
:这是 lambda 表达式的函数体。当 lambda 表达式被调用并传入一个整数参数时,它会执行这个函数体中的代码。在这个例子中,它使用std::cout
打印出传入的整数num
,并在其后添加一个换行符。
因此,当 std::for_each(numbers.begin(), numbers.end(), /*lambda expression*/)
被调用时,它会遍历 numbers
向量中的每个元素,并对每个元素执行 lambda 表达式定义的操作(即打印出元素的值)。最终,你会在终端上看到 numbers
向量中的所有元素被依次打印出来。