📅  最后修改于: 2023-12-03 15:14:16.341000             🧑  作者: Mango
Lambda 函数是 C++11 中的一种新特性,它允许我们定义一个匿名函数。
Lambda 函数可以被认为是一个临时的、内联的函数对象。使用 Lambda 函数,我们可以写出更加简洁、高效的代码。
Lambda 函数的语法比较简单,可以归纳为以下几个部分:
[capture-list] (params) mutable exception-> return-type { body }
其中:
capture-list
:捕获列表,用于捕获变量;params
:函数参数列表;mutable
:表示是否可以修改捕获的变量;exception
:异常规格;return-type
:返回类型;body
:函数体。下面是一个简单的 Lambda 函数示例,将两个数相加:
auto add = [](int a, int b) -> int {
return a + b;
};
Lambda 函数返回类型可以根据返回语句自动推导,可以省略不写:
auto add = [](int a, int b) {
return a + b;
};
Lambda 函数可以访问其所在范围内的变量,这些变量称为捕获的变量,捕获的方式称为捕获列表。
捕获列表可以分为以下几种情况:
在这种情况下,Lambda 函数没有访问其所在范围内的任何变量:
[]() {
// 函数体
}
在这种情况下,Lambda 函数可以访问其所在范围内的变量,但无法修改:
int a = 10;
auto func = [a]() {
std::cout << "a = " << a << std::endl;
};
在这种情况下,Lambda 函数会复制所捕获的变量到其内部:
int a = 10;
auto func = [=]() {
std::cout << "a = " << a << std::endl;
};
在这种情况下,Lambda 函数会引用所捕获的变量,可以修改它们的值:
int a = 10;
auto func = [&a]() {
++a;
};
Lambda 函数可以应用于很多场景,比如:
// 将 v 中的元素都乘以 2
std::vector<int> v = {1, 2, 3};
std::transform(v.begin(), v.end(), v.begin(), [](int n){ return n * 2; });
// 使用 Lambda 函数实现函数对象
class MyFunctor {
public:
MyFunctor(int n) : m_n(n) {}
bool operator()(int x) const {
return x == m_n;
}
private:
int m_n;
};
std::vector<int> v = {1, 2, 3};
auto it = std::find_if(v.begin(), v.end(), MyFunctor(2));
auto it2 = std::find_if(v.begin(), v.end(), [](int x){ return x == 2; });
// 使用 Lambda 函数实现回调函数
void do_something(int x, std::function<void(int)> callback) {
callback(x);
}
do_something(42, [](int x){ std::cout << "x = " << x << std::endl; });
Lambda 函数是一种方便、简洁、高效的函数对象,使用它可以让我们写出更加清晰、易读、易维护的代码。在 C++ 中,我们可以使用 Lambda 函数实现很多功能,比如 STL 算法、函数对象、回调函数等等。