Lambda表达式(匿名函数)
C++11中引入了lambda表达式,定义匿名的内联函数。
我们可以直接原地定义函数而不用再跑到外面去定义函数跳来跳去。
同时在stl的排序上也有作用。
[capture] (parameters) mutable ->return-type {statement}
下面逐一介绍各个参数的含义.
[capture]
:
- 捕获:作用是让匿名函数能够访问或者修改函数外部的变量
- 有两种一种是值,一种是引用
- 具体怎么用,我们需要用到某些变量,但是又不想传递参数(或者太多了传递不了参数)就可以通过捕获的方式,如果我们要在lambda表达式中修改这些外面的变量就需要捕获引用,如捕获值,那么这些值则不能改变。
值捕获
void solve()
{
int a=3,b=2;
auto change=[=]()
{
return a*b;
};
cout<<change()<<endl;
}
引用捕获
int a=1,b=2;
auto change=[&]()
{
a=3;
b=4;
};
cout<<a<<' '<<b<<endl;
change();
cout<<a<<' '<<b<<endl;
void solve()
{
auto check=[&](int m)
{
rep(i,1,10) if(i<m) cout<<i<<' ';
cout<<endl;
};
check(3);
}
parameters
:参数
- 这个没什么需要解释的和正常函数的参数是一样的都是传递的值
mutable
利用可变规范,Lambda 表达式的主体可以修改通过值捕获的变量。若使用此关键字,则 parameters 不可省略
void solve()
{
int a = 0;
auto func = [a]() mutable
{
++a;
cout<<a<<endl;
};
func();
cout<<a<<endl;
}
但是修改捕获变量的值不会带到匿名函数外部
return-type
:就是函数的返回类型,在算法竞赛很多时候我们可以用auto代替
auto lam = [](int a, int b) -> int
{
return a+b;
}
如果有多种排序规则可以直接用lambda表达式
sort(vec.begin(), vec.end(), [&](PII& a, PII& b) {return a.second > b.second;});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2023-02-03 2023