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 }
[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
捕捉列表可以组合使用,如:
[=, &a,&b]--表示a和b以引用传递,其余以值传递
[&,a,this]--表示a和this按值传递,其余按引用传递。
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的优势更明显
原文:https://www.cnblogs.com/wangyueyouyi/p/14592858.html