1 形式

 1     形式:
 2     [capture](parameters) mutable -> return-type{statement}
 3     [capture]--捕捉列表[val] [=] [&val] [&]
 4     (parameters)--参数列表,如不需要传递参数,可以连()一起省略
 5     mutable--默认情况下,lambda函数是const函数,mutable可以取消其常量性
 6     ->return-type -- 追踪返回类型,返回类型明确的情况下可以省略
 7     {statement}--函数体
 8     
 9     例子:
10     
11     int main()
12     {
13         int boys=4, girls=3;
14         auto to = [=]()->int{ return boys + girls };
15         //auto to = [=](int a, int b)->int{ return boys + girls };
16         
17         return to;
18     }

2 参数传递

[val]和[=]都是按值传递,这种形势下,作用域内的变量会当作常数进行传递,一旦初始化,值就不再修改,即使重新赋值。

 1     int j=12;
 2     auto val = [=]{ return j+1 ;};
 3     auto ref = [&]{ return j+1 ;};
 4 
 5     cout<<val()<<endl;  //13
 6     cout<<ref()<<endl;  //13
 7 
 8     j = 15;
 9 
10     cout<<val()<<endl;  //13(按值传递,所以j即使第二次被赋值,在lambda函数中,他依然保持初次的赋值12)
11     cout<<ref()<<endl;  //16

3 捕捉列表

捕捉列表可以组合使用,如:
[=, &a,&b]--表示a和b以引用传递,其余以值传递
[&,a,this]--表示a和this按值传递,其余按引用传递。

4 对比

lambda函数与仿函数、函数指针类似

 1 #include<vector>
 2     #inlucde<algorithm>
 3     using namespace std;
 4     vector<int> nums;
 5     vector<int> largeNums;
 6     const int ubound = 10;
 7     
 8     inline void LargeNumsFunc( int i)
 9     {
10         if( i > ubound )
11             largeNums.push_back(i);
12     }
13     
14     void Above()
15     {
16         //传统for循环
17         for( auto it = nums.begin(); it!=nums.end(); ++it)
18         {
19             if(*it > ubound)
20                 largeNums.push_back(*it);
21         }
22         
23         //指针函数
24         for_each(nums.begin(), nums.end(), LargeNumsFunc);
25         
26         //lambda函数和for_each算法
27         for_each( nums.begin(), nums.end(), [=](int i){
28             if(i > ubound )
29                    largeNums.push_back(i);
30         })
31     }
32     //for_each算法参数,一个表示开始的iterator,一个表示结束的iterator,一个接收单个参数的函数

一定程度下,lambda比函数指针和仿函数性能好,因为
a:仿函数与函数指针的定义可能在上下文比较远的位置,查看不方便
b:有时候编译器并不会对函数指针与仿函数进行内联优化,多次循环下,内联的lambda的优势更明显

posted on 2021-03-29 16:08  望月又一  阅读(372)  评论(0编辑  收藏  举报