关于Lambda表达式的研究

关于Lamabda表达式的研究

一、Lamabda的表达式的起源

二、Lamabda表达式的基本原理

三、Lamabda表达式的结构

四、Lamabda表达式的参数说明

五、Lamabda表达式的用法

六、Lamabda表达式的优越性

 

一、Lamabda表达式的起源

Lamabda表达式的起源来自于仿函数,什么是仿函数呢?简单来说就是一个类长得像函数,比如

Class A;

A();

这就是一个仿函数。

那么仿函数究竟是怎样实现的呢?其实他所使用的就是运算符重载,即为:

Class A

{

Void operator() (int a) {}

Int a;

};

 

这就是仿函数的用法。

正如前面所述,Lamabda表达式可以看作一个没有类名的表达式,它就是在编译的时候自己启用了一个类名(至于为什么这么做,这个后面谈到优越性的时候会说)。那么当我们明白了这个知识点之后,我们就可以推导出两个结论:1、那就是仿函数可以在一定程度上替代Lamabda表达式。2、其次,Lamaba表达式的很多性质我们可以从仿函数当中是一样的。

二、Lambda表达式的原理

Lambda表达式,它的核心可以理解成一个临时函数,我们可以在其中实现一些内容,里面有返回值等等,也可以保存下来。

三、Lambda表达式的结构

Lambda表达式的结构如下图所示:

[]() mutable exception ->bool {}

其中,红色部分不能省略,而黑色部分是可以省略的。简单解释一下参数。

四、Lambda表达式的参数说明

[]:该参数表达的是传入的内容,即其他的参数可以通过它传入进Lamada函数中。

()Lamada表达式中我们自己设定的参数

Mutable:表示可以修改[]传入的内容

Exception: 我们可以指定是否传送出异常

Bool: 返回值,我们可以传出任何返回值,int都可以。

{}:函数体要实现的内容

五、Lamada表达式的用法

这里要重点说的是这两个[]mutable,我们在传入参数的时候有两种传法,第一种就是传送value,比如a,第二种传入reference,&a,那么针对这两种情况和mutable的配合就有四种用法:

Value配合无mutable:那么这种情况是不能修改Value的。这可能也是和仿函数的区别吧。

Value配合mutable:这种情况可以修改Value,但是仅仅限于函数内,如果离开的话是Value的值不会有任何改变的。

Reference配合无mutable:这种情况既可以修改,另外同时外面的Value值也随之改变。

Referenve配合mutable:与第三种情况相同。

接着我列出一段代码:

void test_remove::test3()

{

    std::vector<int> vi {5,28,31,46,245,59,24,36};

    int x = 30;

    int y = 50;

    vi.erase(std::remove_if(vi.begin(), vi.end(), [x,y](int n)->bool{

        return x<n && n<y;

    })

        );

 

    for (auto ele : vi) {

        std::cout<<"ele is:"<<ele<<std::endl;

    }

}

 

这里我要说明两点,第一,remove_if中的参数自动传入到int n当中去,所以是int,第二,注意没有声明仅仅写函数体的话是不加分号的。

六、Lambda表达式的优越性

最后说一下Lambda表达式的优越性。第一,Lambda表达式可以传入其他参数。第二,因为在函数体中实现的,所以思路比较清晰。

 

以上就是我对Lambda表达式的研究。

原文地址:https://www.cnblogs.com/songyuchen/p/14674083.html