关闭

浅谈lambda表达式

标签: C++lambda表达式
171人阅读 评论(0) 收藏 举报
分类:

刚开始看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; });

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


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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8522次
    • 积分:222
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类