C++11:Lambda匿名函数

lambda函数是c++11新增的内容

完整结构:

[capture_list](para_list)mutable exception->return_type{ func_body }
[捕捉列表](形参列表)提示符 异常设定->返回类型{函数内容}
  • mutable 是否可以修改捕获的传值变量,默认是const即不可修改 | 使用mutable时前面必须有(para_list)
  • exception 异常设定

匿名函数主要的作用是避免了为一个简短的函数过程创建一个函数,从而减少了标示符,降低了冲突的风险而且比较简洁

常用形式:

[capture_list](para_list)->{ func_body }

简单示例:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
	string s = "asdfhjsakf";
	sort(s.begin(), s.end(), [](char x, char y){
		return x < y;
	});
	cout << s << endl;
}
// aadffhjkss

可以看到不用再另外写一个比较函数cmp了,直接使用匿名函数就更简单

[ ]中的捕获变量用法:
 

捕获形式 说明
[] 不捕获
[para, ...] 以值传递的形式捕获变量
[this] 以值传递的形式捕获this指针
[=] 以值传递的形式捕获所有的外部变量
[&] 以引用传递的形式捕获所有外部变量
[&, a] 以值传递的形式捕获a,以引用传递的形式捕获其他外部变量
[=, &a] 以引用的形式捕获a,以值传递的形式捕获其他外部变量

使用捕获变量的例子:

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
	string s = "asdfhjsakf";
	int a = 1000;
	auto add = [&s, a](){
		s += to_string(a);
	};

	add();

	cout << s << endl;
}
// asdfhjsakf1000

上面使用引用传递的方式传递了s,结果输出s时原本的值已经发生了变化

使用值传递的方式传递了a,是将a复制进了lambda表达式中

几个变形

1. 使用mutable的情况

还是上面的例子,不过此时在匿名函数中尝试修改传入a的值,如果不加mutable,编译报错:

加上mutable允许修改捕获参数之后就正常输出

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, char const *argv[])
{
	string s = "asdfhjsakf";
	int a = 1000;
	auto add = [&s, a]()mutable {
		a = 999;
		s += to_string(a);
	};
	add();

	cout << s << endl;
}
//// asdfhjsakf999

加上mutable允许修改捕获参数之后就正常输出

2. 使用return_type的情况

可以定义返回类型为double

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std;
int main(int argc, char const *argv[])
{
	float r = 12.7;
	float PI = 3.14;
	auto lambda = [PI](float x)->double{
		return PI  * x * x;
	};
	printf("%16.16lf\n", lambda(r));
}
// 506.4506225585937500

3. 当形式参数当定义过长当时候,可以使用auto来自动获得形式参数的类型

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std;
int main(int argc, char const *argv[])
{
	float PI = 3.14;
	auto lambda = [PI](auto x)->double{
		return PI  * x * x;
	};
	printf("%16.16lf\n", lambda(10));
}
// 314.0000000000000000

几个注意:

  1. 匿名函数是c++11的新内容
  2. 在匿名函数的参数列表中使用auto自动判断变量类型是c++14的新内容
  3. 匿名函数当作默认参数的时候不能捕捉变量,否则会报错

参考:

https://blog.csdn.net/sinat_35678407/article/details/82794514

https://blog.csdn.net/xiaoguyin_/article/details/79798362

https://blog.csdn.net/weixin_36750623/article/details/84860652

发布了145 篇原创文章 · 获赞 21 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826242/article/details/102835290