lambda表达式(匿名函数)基本用法

总结:
1、lambda表达式的捕获类型见下详述。
2、返回类型(可以自动推导、可以省略)。
3、捕获的参数可以在函数体中使用。

1、基础概念:
C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式。lambda表达式实质上是创建一个匿名函数/对象。

2、用法介绍:
Lambda(匿名函数)的基本语法:

auto func = [capture] (params) opt -> ret { func_body; };

其中func是可以当作lambda表达式的名字,作为一个函数使用,capture是捕获列表params是参数表opt是函数选项(mutable之类),ret是返回值类型,func_body是函数体。c++11允许省略表达式的返回值定义。
例子:

auto func1 = [&](int x, int y)->int { return x+y; };  

2.1、捕获的具体用法:
lambda表达式允许捕获[capture]一定范围内的变量:

  • []不捕获任何变量
  • [&]引用捕获,捕获外部作用域所有变量,在函数体内当作引用使用
  • [=]值捕获,捕获外部作用域所有变量,并拷贝一份在函数体中使用
  • [=, &a]按引用捕获a变量,其余变量按值捕
  • [a]只值捕获a变量,不捕获其它变量
  • [this]捕获当前类中的this指针,使lambda表达式拥有与类成员函数同样的访问权限

2.2、返回类型(可以自动推导、可以省略):

 auto fun = [](int x, int y)->int {cout << x + y << endl; return y;};  

对于这里的==->int 这个int就是返回值类型==,如果有返回值类型需要在前面加上->
直接省略写成这种格式也可以[](int x,int y){cout<<x+y<<endl;return y;}

2.3、函数体:
lambda表达式的函数体中可以使用捕获的参数

3、常见用法:

std::sort(vec.begin(), vec.end(), [](const A &left, const A &right) { return left.a < right.a; });   
std::vector<uint16_t> aa{1,2,3,4,5};   
std::string s;
for_each(aa.begin(),aa.end(),[&s](auto each){s+=to_string(each) + ',';});   

参考资料:
1、基本概念介绍:C++lambda表达式
2、用法例子:c++11新特性之std::function和lambda表达式


版权声明:本文为qq_33726635原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。