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 @ 2024-02-03 14:06  cxy8  阅读(23)  评论(0)    收藏  举报
相关博文:
阅读排行:
· 我的开源十年
· .net入行第4年
· C#/.NET/.NET Core优秀项目和框架2025年5月简报
· (包含5w字提示词开源)手把手教你搭建开源提示词优化平台
· 上周热点回顾(6.2-6.8)
历史上的今天:
2023-02-03 2023
点击右上角即可分享
微信分享提示