C++ lambda表达式

发布时间:2021-08-15  栏目:C++  评论:0 Comments

lambda表达式是C++11中引入的,lambda表达式又称匿名函数Anonymous function,其构造了一个可以在其作用范围内捕获变量的函数对象。通常它作为一个参数传递给接收函数指针或者函数符的函数使用。在C++的STL算法使用过程中,经常可以看到它的身影。

lambda表达式实际为一个仿函数functor,编译器后会生成一个匿名类(注:这个类重载了()运算符)

与普通函数指针相比,Lambda表达式可以包含数据成员,也就是说它是可以有状态的。

2、lambda表达式的优势
1)遵守就近原则:随时定义随时使用,lambda表达式的定义和使用在同一个地方,并且lambda表达式可以直接在其他函数中定义使用,其他函数没有这个优势。
2)简洁明了:lambda表达式相比较其他函数的更加的简洁明了。
3)效率相对高些:lambda表达式不会阻止编译器的内联,而函数指针则会阻止编译器内联。
4)捕获动态变量:lambda表达式可以捕获它可以访问的作用域内的任何动态变量。

3、lambda表达式基本语法
[capture list] (params list) mutable exception-> return type { function body }
表达式中各个参数的含义如下:
[capture list]:捕获外部变量列表
(params list):形参列表
mutable:表示能不能修改捕获的变量
exception:异常设定
return type:返回类型
function body:函数体
虽然lambda中的参数变量很多,通常情况下并不需要把每一个都使用上,根据自己的需要使用即可,大多数情况下可以直接省略->、mutable、exception,不需要返回类型的话也可以省略return type。一个简单的lambda表达式:[](int x){return x*x;}。

4、lambda表达式捕获外部变量方法
1)参数以值传递方式被捕获:参数以值传递的方式传入到lambda表达式中,值传递方式参数在lambda表达式中值不能被修改。
2)参数引用传递方式被捕获:参数以引用的方式传入到lambda表达式中,引用传递方式参数在lambda表达式内部修改和表达式外部的修改会相互影响。
3)表达式自行推导捕获:当捕获列表[capture list]中不传入任何变量而是写成[=]或者[&],lambda表达式会以值传递[=]或[&]引用传递的方式捕获参数,参数的捕获根据表达式中变量使用情况来推导。

参考:https://blog.csdn.net/toby54king/article/details/105127327

留下评论

You must be logged in to post a comment.

相册集

pix pix pix pix pix pix

关于自己

杨文龙,微软Principal Engineering Manager, 曾在各家公司担任影像技术资深总监、数据科学团队资深经理、ADAS算法总监、资深深度学习工程师等职位,热爱创新发明,专注于人工智能、深度学习、图像处理、机器学习、算法、自然语言处理及软件等领域,目前发明有国际专利19篇,中国专利28篇。

联系我

个人技术笔记

welonshen@gmail.com

2015 in Shanghai