当前位置: 首页 > news >正文

学习记录——day42 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 specifiednote: 'num' declared herenote: 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;//0c("i can't say anymore");cout<<num<<endl;//20return 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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#中的PropertyInfo
  • C++语法基础(一)
  • Oracle(ORA-00210、ORA-00202)控制文件错误
  • Codeforces Round 968 (Div. 2)
  • QT实战项目之音乐播放器
  • MyBatis 源码解析:CachingExecutor 设计与实现
  • 虚拟机【linux】配置无线网络
  • nefu暑假集训5 KMP 个人模板+例题汇总
  • PCM转PCMA(pcm_alaw,G711.A率)转换表 PCM转PCMU(pcm_ulaw,G711.U率)转换表
  • day-49 让所有学生保持开心的分组方法数
  • gitee 简单使用
  • 【护网相关知识】
  • org.apache.commons.lang.math.NumberUtils#isNumber 解释
  • Python实践:多种方式实现数字前补零
  • uniapp壁纸项目笔记
  • [LeetCode] Wiggle Sort
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • angular2开源库收集
  • Asm.js的简单介绍
  • canvas 五子棋游戏
  • Docker下部署自己的LNMP工作环境
  • ES6系列(二)变量的解构赋值
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Linux后台研发超实用命令总结
  • Node + FFmpeg 实现Canvas动画导出视频
  • quasar-framework cnodejs社区
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 安卓应用性能调试和优化经验分享
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 第十八天-企业应用架构模式-基本模式
  • 分享一份非常强势的Android面试题
  • 模型微调
  • 山寨一个 Promise
  • 小程序 setData 学问多
  • 用mpvue开发微信小程序
  • 走向全栈之MongoDB的使用
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #mysql 8.0 踩坑日记
  • #知识分享#笔记#学习方法
  • (C)一些题4
  • (C语言)fread与fwrite详解
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (SERIES12)DM性能优化
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十三)MipMap
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)