C之架构如何定义一个ldqu

北京手足癣医院咨询 http://baidianfeng.39.net/a_zhiliao/210410/8833646.html

本文介绍了如何利用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);预览时标签不可点收录于合集#个上一篇下一篇

转载请注明:http://www.aierlanlan.com/rzgz/487.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了