Lambda 函数是 C++11 引入的一种方便的方式,用于在需要函数对象的地方快速定义简单的匿名函数。Lambda 函数的语法非常灵活,可以在代码中内联定义函数逻辑,无需单独定义一个函数。
Lambda 函数的基本语法如下:
[捕获列表](参数列表) -> 返回类型 {
// 函数体
}
让我们详细解释 Lambda 函数的每个部分:
捕获列表(Capture List):用于指定在 lambda 函数体内可以访问哪些外部变量。可以使用
[&]表示引用捕获(使用外部变量的引用),[=]表示值捕获(使用外部变量的副本),或者可以指定特定的变量进行捕获,例如[x, &y]表示捕获变量x通过值,捕获变量y通过引用。如果不需要捕获任何外部变量,可以留空[]。参数列表:指定 lambda 函数的参数。与普通函数类似,可以指定零个或多个参数,每个参数都有其类型和名称。
返回类型:指定 lambda 函数的返回类型。使用箭头符号
->后跟返回类型。如果 lambda 函数体内只有一条return语句,通常可以省略返回类型,编译器会自动推断返回类型。函数体:包含了 lambda 函数的实际逻辑。在函数体内,可以使用捕获的外部变量和参数来执行所需的操作,并返回结果。
下面是一个简单的 Lambda 函数示例,用于计算两个整数的和:
#include <iostream>
int main() {
int x = 10;
int y = 20;
// 定义 Lambda 函数并立即调用
int sum = [=](int a, int b) -> int {
return a + b + x + y;
}(5, 7);
std::cout << "Sum: " << sum << std::endl; // 输出:Sum: 42
return 0;
}
在上面的示例中,我们定义了一个 Lambda 函数,捕获了外部变量 x 和 y(通过值捕获),并在函数体内计算了传入的参数 a 和 b 的和,并添加了 x 和 y 的值。最后,我们立即调用了这个 Lambda 函数,传入参数 5 和 7,得到计算结果 42。
Lambda 函数非常适用于需要在局部范围内定义简单的函数逻辑的情况,例如在算法函数中作为排序函数、比较函数等。它可以减少代码的复杂性并提高代码的可读性。
例子
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string, int> cnt;
for (auto& word : words) {
++cnt[word];
}
vector<string> rec;
for (auto& [key, value] : cnt) {//哈希表遍历,使用auto& [key,value]
rec.emplace_back(key);
}
sort(rec.begin(), rec.end(), [&](const string& a, const string& b) -> bool {
return cnt[a] == cnt[b] ? a < b : cnt[a] > cnt[b];
});//lambda函数的使用
rec.erase(rec.begin() + k, rec.end());
return rec;
}
};
在Lambda表达式内可以访问当前作用域的变量,用以下方式加以指定:
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
sort(rec.begin(), rec.end(), [&](const string& a, const string& b) -> bool {
return cnt[a] == cnt[b] ? a < b : cnt[a] > cnt[b];
});//这里使用了cnt中的大小比较来给另一个向量rec排序,值得借鉴
在这个 lambda 函数中,我们使用 [&] 引用捕获列表,其中 cnt 和 rec 均可以被引用捕获。
但无法捕获words和k
Lambda 函数的引用捕获仅限于当前定义 lambda 函数的上下文中已经存在的变量。函数参数 words 和 k 是在函数调用时传递给函数的,它们在函数调用结束后会被销毁。因此,这些参数不属于 lambda 函数定义的上下文范围内的变量,lambda 函数无法通过引用捕获来访问它们。
如果需要在 lambda 函数中使用 words 和 k,可以通过值捕获 [=] 将它们作为副本捕获