lambda 表达式(匿名函数)的具体应用和使用场景

lambda 表达式(匿名函数)的具体应用和使用场景

lambda 表达式的定义形式如下:

[capture list] (parameter list) -> reurn type
{
   function body
}

其中:

capture list:捕获列表,指 lambda 表达式所在函数中定义的局部变量的列表,通常为空,但如果函数体中用到了 lambda 表达式所在函数的局部变量,必须捕获该变量,即将此变量写在捕获列表中。捕获方式分为:引用捕获方式 [&]、值捕获方式 [=]。
return type、parameter list、function body:分别表示返回值类型、参数列表、函数体,和普通函数一样。
举例:
lambda 表达式常搭配排序算法使用。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> arr = {3, 4, 76, 12, 54, 90, 34};
    sort(arr.begin(), arr.end(), [](int a, int b) { return a > b; }); // 降序排序
    for (auto a : arr)
    {
        cout << a << " ";
    }
    return 0;
}
/*
运行结果:90 76 54 34 12 4 3
*/

lambda 表达式是一个可调度的代码单元,可以视为一个未命名的内部函数
lambda 函数是一个函数对象,编译器在编译时会生成一个 lambda 对象的类,然后再生成一个该命令未命名的对象
lambda 的形式如下:
[捕获列表] (参数列表) -> 返回类型 { 函数部分 }
[capture list] (parameter list) -> return type

capture list 捕获列表是 lambda 函数所定义的函数的局部变量列表, 通常为空
一个 lambda 只有在其捕获列表中捕获一个所在函数中的局部变量,才能在函数体中使用该变量。

捕获列表只用于局部非 static 变量。 lambda 可以直接使用局部变量 static 变量 和在它所在函数之外的声明的名字。

捕获列表的变量可以分为 值 或 引用传递。

值传递: lambda 捕获的变量在 lambda 函数 创建 就发生了拷贝而非调用时。

隐式捕获:
编译器可以根据 lambda 中的代码推导使用的变量,为指示编译器推断捕获列表,应该在捕获列表中写一个 & 或 =
& 告知编译器采用引用传递方式
= 告知编译器采用值传递方式

当混合使用时,捕获列表第一个参数必须是 & 或 = 且显示捕获的变量必须和隐式捕获使用不同的传递方式
pameter list
参数列表和普通函数类似,但是 lambda 不能有 默认参数【lambda 实参和形参数目一定相等】

return type

与普通函数不同的是: lambda 必须使用位尾置返回 来指定返回类型。
如果忽略返回类型,lambda 表达式会根据函数体中的代码推断出返回类型
若函数体只有一个 return 语句, 则返回类型从返回表达式的类型推断而来,否则,若未指定返回类型,返回类型为 void
Note: 如果 lambda 的函数体包含任意单一 return 之外的内容, 且未指定返回类型,则返回 void
当需要为 lambda 定义返回类型时,必须使用尾置返回类型
function body
与常规函数类似

注意:由于lambda实质上是一个匿名类,捕获列表捕获的元素在匿名类创建时会拷贝进匿名类的private中,所以建议使用值捕获,如果使用引用捕获,容易外部被销毁。

参考书籍:力扣C++面试

原文链接: https://www.cnblogs.com/BailanZ/p/16070660.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    lambda 表达式(匿名函数)的具体应用和使用场景

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/188439

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午2:14
下一篇 2023年2月12日 下午2:14

相关推荐