一、lambda优点
- 减少命名烦恼
- 支持泛型编程
- 简单、使用频率低的操作 lambda可以理解为一个未命名的内联函数,内联函数的语句应该足够简单,否则会影响效率。两种情况最好使用函数而不是lambda表达式,第一种语句较复杂、多;第二种则是调用频繁。
- 解除算法特定谓词限制 一些算法要求可调用对象必须为特定谓词(
find_if
接受单一参数谓词),使用捕获列表可以降低谓词元数
定义一个lambda等效于定义一个新的未命名类类型,向一个函数传递lambda也就是传递一个lambda对象,使用auto定义变量等效于定义了对应的对象。格式如下:
[capture_list](parameter_list)->return type{fucntion body}
函数体内部可以无条件使用外部的全局变量、作用域内的静态变量,需要捕获才能使用外部局部变量,捕获的变量放在中括号内[我是外部局部变量]
,和函数参数一样,捕获变量类型可以是引用或者值捕获。值捕获的变量是不能在函数内进行修改的,这是因为:
- 结果上看,值捕获的变量即使修改了也无法输出
- 效率上看,值捕获的变量应该设置为常量(事实上也是)以提高效率
事实上,值传递在函数上常见,从结果上看,虽然起不到任何作用,但是我可以复用这个空间。所以,lambda表达式在函数体前加入关键字mutable
去掉常量属性。
为了简洁,如果表达式参数列表为空,小括号可省略。
ff = [i]() {i *= 2; };//not allow
ff = [i]() mutable{i *= 2; };//allow
如果捕获的变量较多,捕获列表将会相当冗长。因此C++提供了隐式捕获的符号,它代表着没有显式捕获的所有变量的默认行为,用符号=
没有特别声明的一律按值捕获形式,用符号&
表示没有特殊声明的一律按照引用捕获。
-
parameter_list:参数列表;
-
return type:返回类型;
-
function boby:函数体。
注意事项:
- 尽可能减少捕获量,减少出错的可能;
- 捕获指向性的对象(指针、迭代器和引用)应该特别注意指向对象是否存在;
- 值捕获是快照,引用捕获是地址;
- lambda有返回值。函数体内没有
return
默认返回void
;单个return
出口,lambda自行推断(不用自己写返回类型);多个return
出口,加上-->return type
- this指针,是一个low-level属性的指针,因此不能引用捕获,只能值捕获。
- this指针,你可以使用[=]或者[this]来捕获,[*this]在C++17后可以使用
使用调用运算符()
五、lambda引用捕获和值捕获的捕获时刻引用捕获在调用时进行捕获,而值捕获则是在定义之时进行捕获。
int main()
{
int a=22;
auto f=[a](){cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?