C++:lambda表达式
lambda表达式其实就是匿名函数,即没有函数名的函数
形式
1
| [capture list](parpmeter list)->return type{funcition body}
|
- capture
list(捕获列表)是一个lanbda所在函数中定义的局部变量的列表(通常为空)
无参数lambda
1 2
| auto f=[]{return 42;}; cout<<f()<<endl;
|
带参数lambda
1 2 3
| vector<string> words; sort(words.begin(),words.end(),[](const string &a,const string &b){return a.size()<b.size();});
|
使用捕获列表
1 2 3 4 5 6 7 8
| [sz](const string &s1){return s1.size()>=sz;};
auto wc=find_if(words.begin(),words.end(),[sz](const string&a){return a.size()>=sz;});
for_each(wc,words.end(),[](const string &s){cout<<s<<" ";});
|
引用捕获
1 2 3
| ostream &os=cout;
for_each(words.begin(),words.end(),[&os](const string &s){os<<s<<" ";});
|
隐式捕获
使用&
或=
,分别表示默认引用捕获和值捕获方式
1 2 3 4 5
| for_each(words.begin(),words.end(),[&](const string &s){os<<s<<" ";});
char ss=' ';
for_each(words.begin(),words.end(),[&,ss](const string &s){os<<s<<ss;});
|
指定返回类型
lambda中包含除了return之外其他的语句,没有指定返回类型的情况下,编译器会自动推定为void型,这是指定类型就有必要了。
1
| transform(nums.begin(),nums.end(),nums.begin(),[](int i)->int {if(i<0)return -i;else return i;});
|
使用建议
lambda建议使用在尽在一两个地方的简单操作,对于大量使用或者复杂功能不建议使用,会造成冗余代码和调试困难。
参考资料