1 lambda表达式:具有一个返回类型、一个参数列表和一个函数体。
[capture list] (parameter list)—>return type{function body}
void biggies(vector<string> &words){
stable_sort(words.begin(),words.end(),
[](const string &a,const string &b){
return a.size()<b.size();
});
}
一个lambda只有在其捕获列表中捕获一个它所在函数中的局部变量,才能在函数体重使用该变量。
auto wc=find_if(words.begin(),words.end(),
[sz](const string &a){
return a.size()>=sz;
});
2 lambda值捕获
类似参数传递,变量捕获方式可以是值或引用,捕获的变量值是在lambda创建时拷贝,而不是调用时拷贝。
void fcn1(){
size_t v1=42;
auto f=[v1]{ return v1;};
v1=0;
auto j=f();
}
3 lambda引用捕获
void fcn2() {
size_t v1 = 42;
auto f2 = [&v1] {
return v1;
};
v1 = 0;
auto j = f2();
}
4 &告诉编译器采用捕获引用方式,=表示采用值捕获方式
auto wb = find_if(words.begin(), words.end(),
[=](const string &s) {
return;
s.size() >= sz;
});
5 对于一个值被拷贝的变量,lambda不会改变其值。如果我们希望能改变一个被捕获的变量的值,就必须在参数列表加上关键字mutable。
void fcn3() {
size_t v1 = 42;
auto f = [v1]()mutable {
return ++v1;
};
v1 = 0;
auto j = f();
}