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

C++11——lambda表达式

在这里插入图片描述

文章目录

    • 1. C++98对自定义类型的排序
    • 2. lambda表达式语法
      • 2.1 捕捉列表
    • 3. lambda底层原理

1. C++98对自定义类型的排序

在C++98中,想要对自定义类型就行排序,我们得自己写仿函数来表明我们相对哪一项进行排序

struct Student
{Student(string name, long id, double score):_name(name),_id(id),_score(score){}string _name;long _id;double _score;
};//按名字排序 -- 降序
struct CmpName
{bool operator()(const Student& stu1, const Student& stu2){return stu1._name < stu2._name;}
};
//按学号排序 -- 降序
struct CmpId
{bool operator()(const Student& stu1, const Student& stu2){return stu1._id < stu2._id;}
};
//按分数排序 -- 降序
struct CmpScore
{bool operator()(const Student& stu1, const Student& stu2){return stu1._score < stu2._score;}
};int main()
{vector<Student> v = { {"张三",101,99.3},{"李四",104,85.2},{"王五",102,99.9} };sort(v.begin(), v.end(),CmpName());sort(v.begin(), v.end(),CmpId());sort(v.begin(), v.end(),CmpScore());return 0;
}

如果代码风格较好,然后加上了注释,这其他人一看就懂是什么意思。但如果命名不规范,就是个很头疼的问题。

例如:

int main()
{vector<Student> v = { {"张三",101,99.3},{"李四",104,85.2},{"王五",102,99.9} };sort(v.begin(), v.end(),Cmp1());sort(v.begin(), v.end(),Cmp2());sort(v.begin(), v.end(),Cmp3());return 0;
}

这里的仿函数,我们看到就不知道是对哪一项进行排序,就得往前翻,如果前面的命名也不规范,那就十分痛苦。

而且一旦我们的对象的参数多了,那我们就得写出对应的仿函数,这不是很方便,于是在C++11中出现了lambda表达式

2. lambda表达式语法

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

示例:[] (int x,int y)->int { return x+y;}

  • lambda表达式各部分说明

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

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

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

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

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

int main()
{vector<Student> v = { {"张三",101,99.3},{"李四",104,85.2},{"王五",102,99.9} };sort(v.begin(), v.end(), [](const Student& stu1, const Student& stu2)->bool {return stu1._name < stu2._name; });sort(v.begin(), v.end(), [](const Student& stu1, const Student& stu2)->bool {return stu1._id < stu2._id; });sort(v.begin(), v.end(), [](const Student& stu1, const Student& stu2)->bool {return stu1._score < stu2._score; });return 0;
}

2.1 捕捉列表

  • [var]:表示值传递方式捕捉变量var

    int a = 1;
    int b = 2;
    double rate = 2.5;
    auto f1 = [rate](int x, int y) {return x + y; };
    cout<<f1(a,b)<<endl;	//输出 7.5
    
  • [&var]:表示引用传递捕捉变量var

    适用于对象较大或者需要修改捕捉列表里面的值

    int a = 1;
    int b = 2;
    auto swap1 = [a, b]() mutable {//mutable让捕捉的a b可以修改//但这里面的a b 属于是外面a b的拷贝int tmp = a;a = b;b = tmp;
    };
    swap1();auto swap2 = [&a, &b] {//捕捉引用,可以直接修改外面a b的值了int tmp = a;a = b;b = tmp;
    };
    swap2();
    
  • [=]:表示值传递方式捕获所有父作用域中的变量(包括this)

    捕捉所有的外部变量

    int a = 1;
    int b = 2;
    int c = 3;
    auto f2 = [=]() {cout << a << " " << b << " " << c << " " << endl;
    };
    f2();
    
  • [&]:表示引用传递捕捉所有父作用域中的变量(包括this)

    捕捉所有外部变量的引用

    int a = 1;
    int b = 2;
    int c = 3;	
    auto f3 = [&]() {
    cout << ++a << " " << ++b << " " << ++c << " " << endl;
    };
    f3();
    cout << a << " " << b << " " << c << " " << endl;
    //也可以混合捕捉,这里的a就是不可修改的了,普通捕捉
    auto f4 = [&, a] {
    cout << a << " " << ++b << " " << ++c << " " << endl;
    };
    cout << a << " " << b << " " << c << " " << endl;
    
  • [this]:表示值传递方式捕捉当前的this指针

3. lambda底层原理

int main()
{auto f1 = [](int x, int y) {return x + y; };auto f2 = [](int x, int y) {return x + y; };//f1 = f2;	//errorcout << typeid(f1).name() << endl;cout << typeid(f2).name() << endl;return 0;
}

这段代码运行之后发现,f1f2的类型是

image-20231018120622477

这里lambda的底层就是一个仿函数,就和范围的for的底层就是迭代器一样,上层将其封装了,调用的就是类的operator()

image-20231018121051482

相关文章:

C++11——lambda表达式

文章目录 1. C98对自定义类型的排序2. lambda表达式语法2.1 捕捉列表 3. lambda底层原理 1. C98对自定义类型的排序 在C98中&#xff0c;想要对自定义类型就行排序&#xff0c;我们得自己写仿函数来表明我们相对哪一项进行排序 struct Student {Student(string name, long id…...

美国加密货币交易和借贷平台Membrane Labs完成2000万美元融资

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于美国纽约的加密货币交易和借贷平台Membrane Labs今日宣布已完成2000万美元A轮融资。 参与本轮融资的投资机构包括&#xff1a;Brevan Howard Digital、Point72 Ventures、Jane Street Cap…...

8-k8s-污点与容忍

文章目录 一、概念二、相关操作三、实操污点NoSchedule四、实操污点NoExecute五、实操容忍 一、概念 污点与容忍 污点taints定义在节点之上的键值型属性数据。当节点被标记为有污点&#xff0c;那么意味着不允许pod调度到该节点。 容忍tolerations是定义在 Pod对象上的键值型属…...

钢铁异常分类140篇Trans 学习笔记 小陈读paper

钢铁异常分类 对比学习 比较好用 1.首先&#xff0c;为每个实例生成一对样本&#xff0c; 来自同一实例的样本被认为是正例&#xff0c; 来自不同实例的样本被认为是负例。 2.其次&#xff0c;这些样本被馈送到编码器以获得嵌入。 3.在对比损失[16]的影响下&#xff0c; …...

YOLOv5-理论部分

YOLOv5 作者: Ultralytics 论文源码: https://github.com/ultralytics/yolov5 Ultralytics&#xff1a;“超视觉技术” / “超视觉系统” 0. 引言 “YOLOv5 &#x1f680; 是世界上备受喜爱的视觉人工智能&#xff0c;代表了 Ultralytics 对未来视觉人工智能方法的开源研究&a…...

蓝桥等考C++组别一级004

第一部分&#xff1a;选择题 1、C L1&#xff08;15分&#xff09; 下列是编程语言的一项是&#xff08; &#xff09;。 A. C B. Word C. Excel D. PowerPoint 正确答案&#xff1a; A 2、C L1&#xff08;15分&#xff09; 仔细阅读以下程序代码&#xff0c;其中有…...

分布式服务的链路跟踪 Sleuth Micrometer zipkin OpenTelemetry

由来 在分布式应用开发过程中&#xff0c;一个请求会调用多个应用&#xff0c;会有那种需要知道各个应用之间耗时的想法&#xff0c;这样可以知道一个调用的总时长以及各个组件之间的处理耗时&#xff0c;后面方便定位问题。 理论依据 起源于 google dapper 论文 https://re…...

CUDA学习笔记4——自定义设备函数

自定义设备函数 核函数&#xff1a;__global__修饰&#xff1b;在设备中执行&#xff1b;设备函数&#xff1a;__device__修饰&#xff1b;在设备中执行&#xff1b;只能被核函数或其他设备函数调用&#xff1b;主机函数&#xff1a;__host__修饰&#xff08;可省略&#xff0…...

微前端四:qiankun在开发中遇到的问题

在qiankun开发中会遇到很多问题&#xff0c;上一篇微前端三&#xff1a;qiankun 协作开发和上线部署其实也是在解决一些经常遇到的问题&#xff0c;下面的两点也算是比较经典的了 1、子应用图片路径问题 2、基座是Vue2.0 element ui 配合 子应用 Vue3.0 element plus 导致的样…...

Android DisplayPolicy增加一些动作,打开后台接口

Android DisplayPolicy增加一些动作&#xff0c;打开后台接口 前言一、了解android全局滑动事件的拦截二、修改1.DisplayPolicy.java修改 前言 一些后台接口 界面之类的不方便打开&#xff0c;但是测试需要用到&#xff0c;这里就添加一个10秒内上拉6下&#xff0c;打开一个后…...

基于Linux安装Hive

Hive安装包下载地址 Index of /dist/hive 上传解压 [rootmaster opt]# cd /usr/local/ [rootmaster local]# tar -zxvf /opt/apache-hive-3.1.2-bin.tar.gz重命名及更改权限 mv apache-hive-3.1.2-bin hivechown -R hadoop:hadoop hive配置环境变量 #编辑配置 vi /etc/pro…...

FPGA 图像缩放 1G/2.5G Ethernet PCS/PMA or SGMII实现 UDP 网络视频传输,提供工程和QT上位机源码加技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐UDP视频传输--无缩放FPGA图像缩放方案我这里已有的以太网方案 3、设计思路框架视频源选择ADV7611 解码芯片配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 UDP协议栈UDP视频数据组包U…...

重复控制逆变器的仿真分析研究

摘 要 本次设计主要以重复控制逆变器控制系统设计应用作为研究背景&#xff0c;运用MATLAB/Simulink仿真工具搭建相应的仿真模型。重复控制逆变器控制系统拥有很好的动态特性&#xff0c;运行稳定性高、调速的范围较大&#xff0c;性能可靠等&#xff0c;在实际生产制造中被广…...

WuThreat身份安全云-TVD每日漏洞情报-2023-10-18

漏洞名称:致远 OA XML 外部实体注入漏洞 漏洞级别:高危 漏洞编号:NULL 相关涉及:V5/G6 V6.0及以上全系列版本 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-26027 漏洞名称:XNSOFT NCONVERT 图像文件缓冲区溢出 漏洞级别:中危 漏洞编号:CVE-…...

开启机器人学新时代,《机器人学建模、规划与控制》完美诠释未来

机器人学是未来发展的热点领域之一&#xff0c;而在这个领域中&#xff0c;建模、规划与控制则是必不可少的基础技术。今天作者要向大家推荐一本机器人学领域的经典教材——《机器人学建模、规划与控制》。 这本书由西安交通大学出版社出版&#xff0c;作者是机器人学专业的鼎…...

C#根据ip获取地理位置信息的方法,史上最全

商业收费 百度地图高德地图腾讯地图纯真IP 开源免费 纯真ip免费版 以前可以直接下载&#xff0c;现在获取ip数据库的方式改变了&#xff0c;自行官网查看把&#xff0c;个人或者学术研究&#xff0c;商用追责&#xff0c;商业用途慎用 using System.Collections.Generic; us…...

Git问题汇总

1.取消全局代理 一般报错Failed to connect to github.com port 443 after 21089 ms: Couldn’t connect to server 取消全局代理&#xff1a; git config --global --unset http.proxygit config --global --unset https.proxy#或者 git config --global http.proxy http://…...

【linux 0.11 学习记录】一、环境配置,用Bochs输出hello world

想学习linux&#xff0c;又不知道从哪里下手&#xff0c;体系太大&#xff0c;哪块内容都很多&#xff0c;无奈下选择了linux0.11作为入口&#xff0c;本系列将是学习笔记&#xff0c;希望能坚持下去吧 环境配置 这里使用win10bochs2.7 安装bochs 官网&#xff1a;https://b…...

【LeetCode75】第七十三题 用最少数量的箭引爆气球

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 本题和上一题基本一样&#xff0c;上一题是要我们尽量让区间不重叠&#xff0c;而本题是要我们尽量让区间重叠。 所以我们的做法和上一题…...

航天科技×辰安科技 打造智慧化工园区安全保障平台

近年来&#xff0c;国内化工园区安全事故频发&#xff0c;多起化工园区重特大事故造成了严重人员财产损失的同时&#xff0c;也重创了行业的整体发展。在智能制造和工业互联网的背景下&#xff0c;建设智慧化工园区&#xff0c;使用智能化手段实现安全生产是解决当前化工园区安…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

电脑桌面太单调,用Python写一个桌面小宠物应用。

下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡&#xff0c;可以响应鼠标点击&#xff0c;并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...