学习记录——day43 C++ Lambda表达式

        Lambda表达式相当于在函数中定义一个轻量版函数可以直接使用,也可以赋值给其他函数使用

一、定义格式

        [捕获列表](函数形参列表){函数体}

捕获列表:分为值捕获和引用捕获
    值捕获:值捕获时,表达式中的数据和外界的数据属于不同的数据,并且在非mutable的lambda表达式中值捕获数据可读不可写
        [变量1,变量2,。。。,变量n]:将这些数据都进行值捕获
        [=]:将外界的变量全部进行值捕获
        [=,&变量1,&变量2]:除了将变量1和变量2进行引用捕获外,其他都是值捕获
    引用捕获:表达式中的数据和外界数据属于相同的数据,对数据操作时可读可写
        [&变量1,&变量2,。。。,&变量n]:将这些数据都进行引用捕获
        [&]:将外界的变量全部进行引用捕获
        [&,变量1,变量2]:除了变量1和变量2是值捕获外,其他都是引用捕获

#include <iostream>

using namespace std;

int main()
{

    int num = 0;
    int key = 1;
    int value = 2;

    //auto关键字
    //auto 在C++中 除了是一种存储类型外 还有自动推导的作用
    //auto num = 100;
    //num 会被识别为整型
    //一个auto定义多个变量时,类型要统一  auto key = 20,value = 10;

    //使用auto定义指针
    //auto *ptr = &num 与 auto ptr = &num 是相同的

    //使用auto定义引用 只能为  auto &ref = num;

    //auto一般用于循环

    //auto不能作为函数参数使用


    //定义lambda表达式 值捕获
    auto f = [num,key,value](string msg)mutable->void
    {
        cout<<"Lambda f:: hello world "<<msg<<endl;
        //无捕获
        /*
        cout<<num<<endl;
        error: variable 'num' cannot be implicitly captured in a lambda with no capture-default specified
        note: 'num' declared here
        note: lambda expression begins here
        */
        //[] 捕获 [=] 表示值捕获外界的所有数据
        cout<<num<<key<<value<<endl;

        //值捕获的数据 可读 不可写 (常属性) 与原数据不是同一个
        //num = 20;
        //error: cannot assign to a variable captured by copy in a non-mutable lambda

        //关键字 mutable 可以取消值捕获数据 的常属性(可无)
        num = 20;  // 更改的是函数中的 num 不影响外界的 num

        //->void  表示函数返回值类型为 ->void 可无 系统根据 return 后的数据类型推导
        //无 return 默认返回值类型为 void
    };


    //定义lambda表达式 引用捕获
    //[] 捕获 [&] 表示引用捕获外界的所有数据 [&,value] 表示值引用获外界除value外的所有数据
    auto c = [&num,&key,&value](string msg)
    {
        num = 20;  //引用捕获的数据和外界是同一个

        cout<<"Lambda c:: hello world "<<msg<<endl;

        cout<<num<<key<<value<<endl;

    };


    //调用函数
    f("what can i say");
    cout<<num<<endl;//0
    c("i can't say anymore");
    cout<<num<<endl;//20


    return 0;
}

 二、lambda表达式作为算法策略

#include <iostream>
#include <algorithm>

using namespace std;

//定义全局函数作为策略
int comp(int a ,int b)
{
    return a > b; //前大后小
}

//定义仿函数作为策略
class comp1
{
public:
    comp1(){}
    int operator()(int a ,int b)
    {
        return a > b; //前大后小
    }
};

int main()
{
    int arr[] = {0,3,4,6,7,8,9,5};
    int len = sizeof(arr)/sizeof (arr[0]);

    //排序(快排)
    sort(arr,arr + len);//不加策略 默认升序
    for(auto val:arr)
    {
        cout<<val<<" "<<endl;
    }
    cout<<endl;

    //全局
    sort(arr,arr + len,comp);//加入 降序策略
    for(auto val:arr)
    {
        cout<<val<<" "<<endl;
    }
    cout<<endl;

    //仿函数
    sort(arr,arr+len,comp1());

    //lambda表达式
    sort(arr,arr+len,[](int a,int b){return a>b;});
    
    return 0;
}

  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值