C++:lambda表达式

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;//打印 42

带参数lambda

1
2
3
vector<string> words;
sort(words.begin(),words.end(),[](const string &a,const string &b){return a.size()<b.size();});
//对words里字符串以字符串长度进行排序

使用捕获列表

1
2
3
4
5
6
7
8
[sz](const string &s1){return s1.size()>=sz;};
//sz为该范围内的局部变量

auto wc=find_if(words.begin(),words.end(),[sz](const string&a){return a.size()>=sz;});
//返回第一个字符串长度大于sz的迭代器

for_each(wc,words.end(),[](const string &s){cout<<s<<" ";});
//输出所有长度大于sz的字符串

引用捕获

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建议使用在尽在一两个地方的简单操作,对于大量使用或者复杂功能不建议使用,会造成冗余代码和调试困难。

参考资料

  • C++ Primer.第五版