前言
见到lambda表达式,你觉得又熟悉又陌生,不知道它到底有什么特殊的意义呢?
lambda
我们来看一下书写方式:
int count(0);
[&count](int x){
count+=(x%13==0);
}
int m(10);
if([](m) {return m%3==0;})
...
else
...
我们只是定义了一个lambda表达式,可以看到它并没有名字,当然也是可以加名字的,后面会提到;
有两个参数:x、count
;
有两个括号:[]、()
;
中括号内书写引用参数,小括号内书写普通形参;
和普通定义方式的区别
这一部分我们可以不必纠结,他就是像上面那样定义的:
没有返回类型;
没有函数名;
出现了[ ]
这个符号;
特殊之处:
1、需要加返回类型的情况:
上面我们写的第一个式子是没有返回值的,会自动推断返回void
;
第二个式子有返回值,也会自动推断返回bool
;
自动类型推断并不是适用任何情况:语句并不是只有一条返回语句组成时
像这个:
[] (double x) ->double{
int y=x;
return x-y;
}
这时就像上面那样需要添加->double
,这也是C++11新增的返回类型后置语法。
为何使用lambda
表达式
1、lambda可以直接定义并使用在需要使用的地方,而函数通常必须定义在外面,因为函数内部无法定义函数,当修改时可能需要翻阅多页代码去寻找它;
2、lambda表达式可以起名
下面的代码是重复的:
count1=std::count_if(n1.begin(),n1.end(),[](int x){return x%3==0;});
count2=std::count_if(n1.begin(),n1.end(),[](int x){return x%3==0;});
可以这样起名和使用:
auto mod3=[](int x){return x%3==0;};
count1=std::count_if(n1.begin(),n1.end(),mod3);
count2=std::count_if(n1.begin(),n1.end(),mod3);
bool result=mod3(z);
并且编译器通常不会阻止lambda表达式的内联;