📅  最后修改于: 2023-12-03 15:29:49.601000             🧑  作者: Mango
在程序设计中,Lambda表达式是一种便捷的、匿名函数的写法,允许我们在需要函数对象的地方使用一个临时的、匿名的函数。相比传统的函数指针,lambda表达式更加灵活、易于使用。
Lambda表达式的基本语法如下:
[capture-list] (parameters) -> return-type { function-body }
capture-list
指定用于捕获变量的列表。这个列表被放置在方括号中,并用逗号分隔。注意,这个选项是可选的,如果lambda表达式不需要捕获变量,则可以省略这个选项;parameters
指定函数参数列表,即你期望在lambda函数中使用的参数;return-type
指定返回值类型;function-body
指定实际的函数体。下面是一个简单的例子,它使用lambda表达式打印“Hello, world!”:
auto hello = []() {
std::cout << "Hello, world!" << std::endl;
};
hello();
这个例子中,我们使用[]
来指定不需要捕获任何变量,()``表示接受0个参数,
-> void说明函数不返回任何东西,而
{}`里面是要执行的代码。
Lambda表达式的一个特点是能够捕获定义在本地作用域中的变量。这意味着你可以访问函数外部定义的变量,并在lambda表达式中进行操作。
捕获变量有两种方式:通过值传递和通过引用传递。使用[]
可以指定捕获方式。例如:
int x = 10;
auto f1 = [x]() {
std::cout << "x = " << x << std::endl;
};
auto f2 = [&x]() {
x++;
};
f1();
f2();
std::cout << "new x = " << x << std::endl;
这个例子中,我们定义了两个lambda表达式,一个通过值传递捕获了变量x
,而另一个通过引用传递捕获了变量x
。在调用f1
函数时,我们能够输出x
的值,而在调用f2
函数时,我们修改了x
的值,并在后面输出了这个新的值。
标准库中的一些算法函数(如std::sort()
、std::transform()
等)在C++11中已经支持lambda表达式。这意味着你可以用lambda表达式来指定这些函数在执行时所需的函数操作。
例如,下面的代码使用lambda表达式对一个整数向量进行排序:
std::vector<int> my_vector = { 4, 8, 1, 3, 9, 7 };
std::sort(my_vector.begin(), my_vector.end(), [](int a, int b) {
return a < b;
});
for (auto i : my_vector) {
std::cout << i << " ";
}
这个例子中,我们使用std::sort()
函数对一个整数向量进行排序。在第三个参数中,我们使用lambda表达式来指定如何进行排序,即以a < b
为比较条件进行排序。
Lambda表达式在C++11中被引入,它是一种便捷的、匿名函数的写法,能够帮助程序员更加灵活、方便地处理函数对象。除了基本语法之外,我们还可以使用捕获变量、标准库等特性来增强lambda表达式的功能。