浅谈lambda表达式

刚开始看lambda表达式有种懵逼的感觉,和平时的语法习惯太格格不入了,但是后来看了一些介绍后才发现这个新特性还是挺好用的,要问我lambda表达式是什么,其实它是一个函数,一个匿名函数,通常是我们需要一个函数,但是又不想费神去命名一个函数,这个时候我们可以使用lambda表达式。

lambda表达式是由这几部分构成的:



1.[] Capture 子句(在 C++ 规范中也称为 lambda 引导。)
2.() 参数列表(也称为 lambda 声明符)
3. mutable 可变规范,表示运行函数体修改通过拷贝捕获的参数
4.异常规范,声明可能抛出的异常
5.尾随返回类型。
6.{}“lambda 体
需要特别注意的是,除了Capture字句和lambda函数体不能省略之外,剩下的四部分均可以根据要求省略。

比如我想写一个函数打印hello world,按照函数习惯需要命名一个函数,然后在主函数中调用,但是用lambda表达式我们可以这样写:

int main()
{
	auto f = [](){cout << "Hello World" <<endl; };
	f();
	return 0;
}
运行结果会打印输出Hello World。
下面我们再来看一个小程序:

int main()
{
	int i = 0;
	cout << i << endl;
	auto f=[=]()mutable{cout << ++i << endl; };
	f();
	cout << i << endl;
	return 0;
}
输出结果是0 1 0,我们发现capture字句中多了个=符号,这代表把外部变量i拷贝一份传进了函数体进行操作,所以才会输出0 1 0.要注意的是,此处的mutable不能省略,因为我们在函数体中改变了外部变量i的值。

如果把=改成&呢?我们来试一试:

auto f=[&]()mutable{cout << ++i << endl; };

输出结果:0 1 1.引用改变的是自身的值。

lambda表达式有什么用呢? lambda的作用就是创建一个临时匿名函数,想想有STL算法中很多需要传递谓词函数,比如count_if。假如我有一个字符串容器,我需要统计长度大于3的个数,则可以这样:

vector<string> s = { "1", "11", "111", "1111", "11111", "111111", "1111111" };
cout << count_if(begin(s), end(s), [](string s){return s.size() > 4; });

这样比较简洁,不必再重新声明一个函数了。


阅读后请留下你们的脚印,欢迎斧正,谢谢!


阅读更多
文章标签: C++ lambda表达式
个人分类: C++
上一篇C++泛型算法中的accumulate
下一篇kali中如何安装增强工具
想对作者说点什么? 我来说一句

Lambda表达式与LINQ.pdf

2018年04月02日 1.67MB 下载

没有更多推荐了,返回首页

关闭
关闭