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 { function body }
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++面试
本文来自博客园,作者:{BailanZ},转载请注明原文链接:https://www.cnblogs.com/BailanZ/p/16070660.html