• lambda表达式(C++11)


    C++98的缺陷

    在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法
    如果待排序元素为自定义类型,需要用户定义排序时的比较规则

    struct Goods
    {
    	string _name; // 名字
    
    	double _price; // 价格
    	Goods(const char* str, double price)
    		:_name(str)
    		, _price(price)
    	{}
    };
    

    当我们想对这个类型根据价格的高低进行排序时,我们可以利用仿函数

    struct ComparePriceLess
    {
    	bool operator()(const Goods& gl, const Goods& gr)
    	{
    		return gl._price < gr._price;
    	}
    };
    

    但仿函数写法太复杂了,为了解决这一点,因此,在C++11语法中出现了Lambda表达式

    lambda表达式

    sort(v.begin(), v.end(), 
    [](const Goods& g1, const Goods& g2){return g1._price < g2._price; });
    sort(v.begin(), v.end(),
     [](const Goods& g1, const Goods& g2){return g1._price > g2._price; });
    

    lambda表达式语法

    lambda表达式书写格式:[capture-list] (parameters) mutable -> return-type {statement }

    lambda表达式各部分说明

    [capture-list] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来
    判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。

    (parameters):参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略

    mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。mutable在大部分情况下省略

    ->returntype:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。

    {statement}:函数体。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

    注:参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空

    先看一个完整的lambda表达式

    auto add = [x](int a) mutable -> int { x *= 2; return a + x; };
    

    捕捉列表说明

    [var]:表示值传递方式捕捉变量var
    [=]:表示值传递方式捕获所有父作用域中的变量(包括this)
    [&var]:表示引用传递捕捉变量var
    [&]:表示引用传递捕捉所有父作用域中的变量(包括this)
    [this]:表示值传递方式捕捉当前的this指针

    注意:
    语法上捕捉列表可由多个捕捉项组成,并以逗号分割。
    比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量
    [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量

    lambda表达式的常见用法

    //自定义类型的排序
    sort(v.begin(), v.end(),
    	[](const Goods& p1, const Goods& p2) { return  p1._price > p2._price; });
    
  • 相关阅读:
    frontiers期刊论文版面费缴纳流程(截止发文全网最详细hhh)
    C#学习系列相关之多线程(五)----线程池ThreadPool用法
    Redis 常用基本命令
    Android Jetpack学习系列——Room
    JavaBean 和 Spring Bean的区别
    ROS2自学笔记:通信接口
    k8s的pod网络为什么要基于overlay网络?
    【目标检测】yolov7改进系列:添加CBAM注意力机制
    【计算机网络微课堂】5.8 TCP的运输连接管理
    消息的并发处理
  • 原文地址:https://blog.csdn.net/zjq_love/article/details/127095330