• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

碧海无波,细水长流

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

关于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表达式的研究。

posted on 2021-04-18 17:53  碧海无波,细水长流  阅读(122)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3