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;
}

但是修改捕获变量的值不会带到匿名函数外部
image

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;});
posted @   cxy8  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2023-02-03 2023
点击右上角即可分享
微信分享提示