【C++技能树】Lambda表达式

在这里插入图片描述
Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!


在这里插入图片描述

0. Lambda表达式简介

在C++98及之前,想要对sort进行自定义排序,或者对自定义类型进行排序需要写一个仿函数。

例如,想要从大到小对num进行排序需要这样写

struct Greater{
    bool operator()(int x,int y)
    {
        return x>y;
    }
};
int main()
{
    vector<int>num;
    sort(num.begin(),num.end(),Greater());
}

为了一个可能只在全局中使用一次的函数来创建一个类得不偿失,也有点麻烦.所以引入了Lambda表达式

1. Lambda表达式

在C++11,引入了Lambda表达式来解决这个问题,其更像一种匿名函数.生命周期只在当前这一行

继续引用上文排序的例子,现在可以这样写

int main()
{
    vector<int>num;
    sort(num.begin(),num.end(),[](int x,int y){
        return x>y;
    });
}

仅需要一行即可完成该功能,该函数生命周期也仅在这一行.

这个表达式长得十分Python,是从Python那引用过来的特性

2. Lambda表达式语法

Lamda表达式总体框架

[capture-list](parameters)mutable ->return-type {
    {statement}
}
  1. statement:为函数体,正常写函数即可

  2. parameters:为参数列表

  3. mutable:可取消参数列表的常量属性

  4. return-type:return-type可由编译器自动推导可省略

  5. capture-list:参数捕获列表,可以理解为接下来可以在函数中使用哪些已有的变量

    • [var]表示复制某一个变量的值
    • [&var]表示引用某一个变量
    • [=]复制所有变量
    • [&]引用所有变量
    • [this]引用this指针

    这些可以进行一个组合,表示复制所有全局变量,仅引用a与b,不可重复引用

    [=,&a,&b](){
        
    }
    重复引用
    [=,a,b](){
        
    }
    

    一个引用了全局变量的例子

    int a=0,b=1;
    auto f1=[&,a]()mutable{
    a++,b++;
    };
    f1();
    cout<<a<<" "<<b;
    

    这里的结果为0,1.加上mutable是为了解决a为const的限制,即可对a进行自增的操作.

  6. Lambda表达式之间不可以互相赋值,即使看起来类型相同,但其背后的类型是不同的.我们用typeid来查看下

    auto f2=[](){cout<<"hello";return 0;};
    auto f1=[](){cout<<"hi";return 0;};
    cout<<"f2: "<<typeid(f2).name()<<endl;
    cout<<"f1: "<<typeid(f1).name();
    

image-20231023192508611

很明显其为不同的函数类型,所以不可以互相赋值

  1. 其底层为函数对象(仿函数)实现的,本质上没有什么差别

    image-20231023192650565
    image-20230905164632777

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值