Lambda函数

Lambda 函数是 C++11 引入的一种方便的方式,用于在需要函数对象的地方快速定义简单的匿名函数。Lambda 函数的语法非常灵活,可以在代码中内联定义函数逻辑,无需单独定义一个函数。

Lambda 函数的基本语法如下:

[捕获列表](参数列表) -> 返回类型 {
    // 函数体
}

让我们详细解释 Lambda 函数的每个部分:

  1. 捕获列表(Capture List):用于指定在 lambda 函数体内可以访问哪些外部变量。可以使用 [&] 表示引用捕获(使用外部变量的引用),[=] 表示值捕获(使用外部变量的副本),或者可以指定特定的变量进行捕获,例如 [x, &y] 表示捕获变量 x 通过值,捕获变量 y 通过引用。如果不需要捕获任何外部变量,可以留空 []。

  2. 参数列表:指定 lambda 函数的参数。与普通函数类似,可以指定零个或多个参数,每个参数都有其类型和名称。

  3. 返回类型:指定 lambda 函数的返回类型。使用箭头符号 -> 后跟返回类型。如果 lambda 函数体内只有一条 return 语句,通常可以省略返回类型,编译器会自动推断返回类型。

  4. 函数体:包含了 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,可以通过值捕获 [=] 将它们作为副本捕获

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容