C++0x-Lambda表达式
/**注意:Lambdas表达式隐式定义并构建不具名函数对象*///////////////////////////////////////////////////////////////////////////////////////////////////////////**[]操作符为lambda引导符,(intn)为lambda参数声明*不具名函数对象类的函数调用操作符默认返回void*{}说明函数体是复合语句*由以下代码可以看出lambda表达式的效果和函数对象一样*///实例代码1:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;structLambdaFunctor{voidoperator()(intn){cout<<n<<"";}};intmain(){vector<int>v;for(inti=0;i<10;++i){v.push_back(i);}for_each(v.begin(),v.end(),[](intn){cout<<n<<"";});cout<<endl;for_each(v.begin(),v.end(),LambdaFunctor());cout<<endl;return0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////**lambda表达式中若有{returnexpression;}*则lambda的返回类型就会自动被推断成expression的类型*但是过于复杂的声明语句lambda函数不会自动推断返回类型*必须显示指定返回类型(实质是函数体中只有一个返回语句时可推断)**注意:->type指定返回值类型,必须置于()参数表后*///实例代码2:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;template<typenamefunc>voidtest(funca){if(a(1,0)){cout<<1<<endl;}else{cout<<0<<endl;}}intmain(){test([](inta,intb){returna>b;});return0;}//实例代码3:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;template<typenamefunc>voidtest(funca){cout<<a(1,0)<<endl;}intmain(){test([](inta,intb)->int{if(a%2==0){returna*a*a;}else{returna/2;}});return0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////**通常空[]表示lambda是无状态的,即不包含数据成员*在lambda引导符[]中可以指定capture-list*函数对象和lambda效果一样,函数对象存储了局部变量的拷贝*所以本质上“按值”传递对lambda而言就是隐式创建韩局部变量函数对象*注意点:*(a)在lambda中不能修改通过传递获得的拷贝,默认情况下函数调用操作符是const属性*(b)有些对象拷贝开销大*(c)局部变量的更新不会反应到通过传递获得的拷贝*///实例代码4:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;//创建含局部变量的函数对象structLambdaFunctor{LambdaFunctor(inta,intb):m_a(a),m_b(b){}booloperator()()const{if(m_a%2==0){returnm_a*m_a*m_a;}else{returnm_a/2;}}private:intm_a,m_b;};template<typenamefunc>voidtest(funca){cout<<a()<<endl;}intmain(){inta=1,b=0;test([a,b]()->int{if(a%2==0){returna*a*a;}else{returna/2;}});test(LambdaFunctor(a,b));return0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////**也可以利用[=]形式lambda引导符“按值传递任何东西”*利用mutable将函数调用操作符转为non-const属性*///实例代码5:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;template<typenamefunc>voidtest(funca){cout<<a()<<endl;}intmain(){inta=1,b=0;test([=]()mutable->int{if(a%2==0){a=2;returna*a*a;}else{a=4;returna/2;}});return0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////**为了避免拷贝的开销出现通过引用传递*语法形式[&x,&y],隐式构建局部变量为引用变量*也可以用[&]来表示“按引用传递任何东西”*可以不用mutable改变属性*可以在引导符[]进行混合使用传递,例如:[&,x,y],[x,&a,y,&b]*///实例代码6:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;template<typenamefunc>voidtest(funca){cout<<a()<<endl;}intmain(){inta=1;test([&a]()->int{if(a%2==0){a=2;returna*a*a;}else{a=4;returna/2;}});cout<<a<<endl;return0;}//////////////////////////////////////////////////////////////////////////////////////////////////////////**注意有一种特别传参用法this*但无法获得一个lambda对象他自身的this指针*[=],[&]可以隐式传递this,[&this]不可以使用*///////////////////////////////////////////////////////////////////////////////////////////////////////////**当lambda不带参数时可以不加()但是同样也不能显示指定返回值类型*但是可以隐式推断返回值类型*定义lambda表达式后可以立即用()操作符使用表达式*可以用#define来简化定义一个lambda表达式*但是不可以用typedef来定义一个类型*///实例代码7:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;template<typenamefunc>voidtest(funca){cout<<a()<<endl;}intmain(){inta=1;test([]{return9;});return0;}//实例代码8:#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;template<typenamefunc>voidtest(funca){cout<<a()<<endl;}#definemengxm[](){cout<<"mengxm"<<endl;}intmain(){mengxm();return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。