lambda 表达式

更新日志 2025/04/19:开工。

概念

支持匿名函数,自带 inline,且在某些方面会减少码量。

格式

注意,这里提供的并不是最完整的格式,但是更细节的语法一般用不到。

一个标准简化格式是:

[captures](params)->type{body};

一个更简化的格式是:

[captures](params){body};

captures

有三种:[][&][=]。这个参数表示对外界变量之类的捕获。

空就是不捕获外界变量,[&] 会以引用形式捕获外界变量,[=] 则会拷贝一份,不会影响外界变量本身。

一般情况下用 [&] 就行了,拷贝变量的话直接函数内新开一个就行。并且如果你拷贝了一个数组那么复杂度会直接乘一个拷贝所用的 n,因此没有什么必要。

当然如果不需要使用外界变量而只使用传入的变量的话当然是 [] 更快些。

params,type,body

都是正常函数写法,函数怎么写就怎么写。

params 表示传参,type 是返回值类型(默认 auto),body 就是函数体。

使用

匿名

直接使用:

[](int a,int b){return a*b;}(3,5)

你会发现这很鸡肋。

但是如果你需要传入一个比较函数,那就很有用了,用排序举个例子:

sort(v.begin(),v.end(),[](int a,int b){return a>b;});

不用在外部写一个 cmp 函数了。

命名

等价于正常定义函数吧,但是你可以限定作用域防止重名。

你在哪里定义的匿名函数,其作用域及能捕捉到的变量作用域就和那个位置本来的作用域是一样的。这样可以方便地使用很多局部变量。

举个例子:

auto cmp=[](int a,int b){return a>b;};
sort(v.begin(),v.end(),cmp);
posted @ 2025-04-19 00:32  LastKismet  阅读(21)  评论(0)    收藏  举报