本文介绍了如何利用C++中的Lambda表达式来灵活地定义函数。
1什么是Lambda表达式?
2为什么要使用Lambda表达式?
3如何定义Lambda表达式?
3.1基本形式
3.2变量捕捉列表[capture]
4Lambda表达式使用示例
4.1定义“阅后即焚”的函数
4.2STL容器的操作示例
C++中的Lambda表达式
1什么是`Lambda`表达式?自C++11开始,C++提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式)。Lambda表达式把函数看作对象,让函数可以像对象一样使用,比如可以将函数赋给变量,或作为参数传递,极大提高了程序的灵活性。
2为什么要使用`Lambda`表达式?定义一个“阅后即焚”的函数:
即该函数的仅在当前作用域内使用,且复用函数的几率较低;
使用Lambda表达式定义函数,能显著提升代码的可读性和灵活性。
STL容器的操作需要:
在C++的STL容器中,存在大量以Lambda表达式作为参数的容器操作函数;
使用Lambda表达式能极大简化容器的操作。
3如何定义`Lambda`表达式?3.1基本形式Lambda表达式的常用基本形式如下:
[capture](parameters)-return-type{body}
其中:
[capture]:Lambda表达式外部变量捕捉列表,后文详细介绍。
(parameters):参数列表,与定义函数时的参数列表含义相同。
-return-type:返回类型。返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导。
{body}:函数体。内容与普通函数一样,能够同时使用[capture]中捕获的变量,以及(parameters)中传入的参数。
例如:
intz=5;[z](intx,inty){returnx(y-z);};[z](intx,inty)-bool{returnx(y-z);};
即一个Lambda表达式只有三部分:
[](){};3.2变量捕捉列表[capture]
Lambda表达式中的[]用于指定变量的传递形式:
[]:不定义任何变量。使用未定义变量会引发错误。
[x,y]:x以传值方式传入(默认),y以引用方式传入。
[]:任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]:任何被使用到的外部变量都隐式地以传值方式加以引用。
[,x]:x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=,z]:z显式地以引用方式加以引用。其余变量以传值方式加以引用。
[this]:通过引用方式捕获当前对象(其实是复制指针);
[*this]:通过传值方式捕获当前对象;
4`Lambda`表达式使用示例4.1定义“阅后即焚”的函数实现简单加法的操作,若采用传统定义函数的方式:
//方法1:传统定义函数的方式intadd1(constintx,constinty){returnx+y;}voidfunction(){intx=1;inty=2;intc1=add1(x,y);}
若采用Lambda表达式:
//方法2:采用`Lambda`表达式voidfunction(){intx=1;inty=2;autoadd2=[](intx,inty){returnx+y;};intc2=add2(x,y);}可以发现,方法2比方法1相比少定义了一个外部函数,使用更加简便,可读性更强。Lambda表达式add2作为局部变量,在超出function()函数体后将被销毁,实现函数的“阅后即焚”。4.2STL容器的操作示例
计算vectorint中偶数元素的数量:
vectorintvec={1,2,3,4,5,6};inteven_count=0;//vec中偶数的数量//定义lambda表达式,用于计算偶数的数量autocountEvenNum=[even_count](intval){if(!(val1))++even_count;};for_each(vec.begin(),vec.end(),countEvenNum);cout"Thenumberofevenis"even_countendl;
计算vectorint中满足某一条件的元素的数量:
vectorintvec={1,2,3,4,5,6};autocondition1=[](constintval){returnval3;};intcount1=count_if(vec.begin(),vec.end(),condition1);intx=1;inty=4;autocondition2=[x,y](constintval){return(val=x)and(val=y);};intcount2=count_if(vec.begin(),vec.end(),condition2);预览时标签不可点收录于合集#个上一篇下一篇