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

C++进阶 —— lambda表达式(C++11新特性)

目录

一,模板函数sort

二,lambda表达式


一,模板函数sort

        在C++98中,如对一个数据集合中的元素进行排序,可使用模板函数sort,如元素为自定义类型,需定义排序时的比较规则;随着C++的发展,人们开始觉的上面的写法太复杂了,为了实现一个算法algorithm,都要重新写一个类,如每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,都会非常不方便;

//模板函数sort,元素为内置类型
int arr[] = { 4,1,5,3,8,7 };
std::sort(arr, arr + sizeof(arr) / sizeof(arr[0]));
std::sort(arr, arr + sizeof(arr) / sizeof(arr[0]), greater<int>());
//模板函数sort,元素为自定义类型
struct Goods
{string _name;double _price;
};
struct Compare
{bool operator()(const Goods& gl, const Goods& gr){ return gl._price <= gr._price; }
};
int main()
{Goods gds[] = { { "苹果", 2.1 }, { "相交", 3 }, { "橙子", 2.2 }, {"菠萝", 1.5} };sort(gds, gds + sizeof(gds) / sizeof(gds[0]), Compare());return 0;
}

二,lambda表达式

        C++11引入了lambda表达式(又称匿名函数),在传递给函数参数的位置,快捷定义匿名函数对象;其实际是一个仿函数,编译器会生成一个匿名类(此类重载了()运算符);

//lambda表达式实际是一个匿名函数
Goods gds[] = { { "苹果", 2.1 }, { "相交", 3 }, { "橙子", 2.2 }, {"菠萝", 1.5} };
sort(gds, gds + sizeof(gds) / sizeof(gds[0]), 
[](const Goods& l, const Goods& r)->bool{return l._price < r._price;});

语法:[capture-list] (parameters) mutable -> return-type { statement }

  • [capture-list],捕捉列表;
    • 该列表总是在lambda函数的开始位置,编译器根据其来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量来供lambda函数使用;
  • (parameters),参数列表;
    • 与普通函数的参数列表一致,如不需要参数传递,可连同()一起省略;
  • mutable,取消其常量性;
    • 默认情况下lambda总是一个const函数,mutable可取消其常量性,使用该修饰符时参数列表不可省略(即使参数为空);
  • -> return-type,返回值类型;
    • 用追踪返回类型形式,声明函数的返回值类型,没有返回值时此部分可省略,返回值类型明确情况下也可省略,由编译器对返回类型进行推导;
  • { statement },函数体;
    • 该函数体内,除了可以使用参数外,还可以使用所有捕获到的变量;

注,在lambda函数定义中,参数列表和返回值类型都是可选部分,而捕捉列表和函数体可以为空;因此C++11中最简单的lambda函数为:[]{};该函数不能做任何事;

        lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如想直接调用,可借助auto将其赋值给一个变量;

[] {};
int a = 3, b = 4, x = 10;
[=] {return a + 3; };
[&](int c) {b = a + c; };
auto fun1 = [=, &b](int c)->int {return b += a + c; };
fun1(10);
auto fun2 = [x](int a) mutable { x *= 2; return a + x; };
fun2(10);

[capture-list] 捕捉列表

捕捉列表描述了上下文中那些数据可被lambda使用,及使用的方式(传值、传引用);

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

注:

  • 父作用域指包含lambda函数的语句块;
  • 语法上捕捉列表可由多个捕捉项组成,以逗号隔开;
  • 捕捉列表不允许变量重复传递,否则编译报错;
  • 在块作用域意外的lambda函数捕捉列表必须为空;
  • 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或非局部变量都会编译报错;
  • lambda表达式之间不能相互赋值,即使看起来类型相同;

函数对象与lambda表达式

        函数对象又称仿函数,即可以像函数一样使用的类对象,就是在类中重载了operator()运算符的类对象;实际上,底层编译器对于lambda表达式的处理方式,完全是按照函数对象的方式处理的,即如定义了一个lambda表达式,编译器会自动生成一个类,该类中重载了operator();

class Rate
{
public:Rate(double rate):_rate(rate){}double operator()(double money, int year){ return money * _rate * year; }
private:double _rate;
};int main()
{//函数对象double rate = 0.49;Rate r1 = (rate);r1(10000, 2000);//lambda表达式auto r2 = [=](double money, int year)->double {return money * rate * year; };r2(10000, 2000);return 0;
}

相关文章:

C++进阶 —— lambda表达式(C++11新特性)

目录 一&#xff0c;模板函数sort 二&#xff0c;lambda表达式 一&#xff0c;模板函数sort 在C98中&#xff0c;如对一个数据集合中的元素进行排序&#xff0c;可使用模板函数sort&#xff0c;如元素为自定义类型&#xff0c;需定义排序时的比较规则&#xff1b;随着C的发展…...

数据结构04:串的存储结构与KMP算法

前言 参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》 参考用书配套视频&#xff1a;4.1_1_串的定义和基本操作_哔哩哔哩_bilibili 特别感谢&#xff1a; Google Bard老师[解释KMP&#xff0c;修改BUG]、Chat GPT老师[修改BUG]、BING老师[封面图]~ 当我请求BI…...

零基础快速搭建私人影音媒体平台

目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.公网访问测试 5. 结语 转载自cpolar极点云的文章&#xff1a;零基础搭建私人影音媒体平台【…...

C++map和set

目录&#xff1a; 什么是关联式容器&#xff1f;键值对树形结构的关联式容器 set的概念multiset的使用pair和make_pair map的概念用“[]”实现统计水果的次数 multimap的使用 什么是关联式容器&#xff1f; 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比…...

python接口测试之测试报告

在本文章中&#xff0c;主要使用jenkins和编写的自动化测试代码&#xff0c;来生成漂亮的测试报告&#xff0c;关于什么是CI这些我就不详细的介绍了&#xff0c;这里我们主要是实战为主。 首先搭建java的环境&#xff0c;这个这里不做介绍。搭建好java的环境后&#xff0c;在h…...

HGFormer:用于领域广义语义分割的层级式分组Transformer

文章目录 HGFormer: Hierarchical Grouping Transformer for Domain Generalized Semantic Segmentation摘要本文方法实验结果 HGFormer: Hierarchical Grouping Transformer for Domain Generalized Semantic Segmentation 摘要 目前的语义分割模型在独立同分布条件下取得了…...

async函数用法

目录 1.概念 2.本质 3.语法 4.特点 5.async基本使用 6.async里的await普通函数返回值 7.async里的await Promise函数成功返回值 8.async里的await Promise函数失败返回值 9.解决async里的await Promise函数失败后不执行下面内容 1.概念 真正意义上解决异步回调的问题&am…...

简谈软件版本周期 | Alpha、Beta、RC、Stable版本之间的区别

目录 &#x1f48c; 引言 ⭕ 软件版本周期 &#x1f6e0;️ 软件开发期 ⚖️ 软件完成期 &#x1f4b0; 商业软件版本 &#x1f48c; 引言 定义好版本号&#xff0c;对于产品的版本发布与持续更新很重要&#xff1b;但是对于版本怎么定义&#xff0c;规则如何确定&#x…...

VS2022发布独立部署的.net程序

.net core支持依赖框架部署和独立部署两种方式&#xff0c;之前学习时是在VSCode中使用dotnet命令发布的。但是在VS2022中却不知道该如何设置。以获取PDF文件使用字体的项目为例&#xff0c;VS2022中默认编译的是依赖框架部署方式&#xff08;编译的结果如下图所示&#xff09;…...

5-网络初识——封装和分用

目录 1.数据封装的过程 2.数据分用的过程 PS&#xff1a;网络数据传输的基本流程&#xff08;以QQ为例&#xff0c;A给B发送一个hello&#xff09;&#xff1a; 一、发送方&#xff1a; 二、接收方&#xff1a; 不同的协议层对数据包有不同的称谓&#xff0c;在传输层叫做…...

机器学习——特征工程

对于机器学习特征工程的知识&#xff0c;你是怎样理解“特征” 在机器学习中&#xff0c;特征&#xff08;Feature&#xff09;是指从原始数据中提取出来的、用于训练和测试机器学习模型的各种属性、变量或特点。特征可以是任何类型的数据&#xff0c;例如数字、文本、图像、音…...

ubuntu安装搜狗输入法,图文详解+踩坑解决

搜狗输入法已支持Ubuntu16.04、18.04、19.10、20.04、20.10&#xff0c;本教程系统是基于ubuntu18.04 一、添加中文语言支持 系统设置—>区域和语言—>管理已安装的语言—>在“语言”tab下—>点击“添加或删除语言”。 弹出“已安装语言”窗口&#xff0c;勾选中文…...

docker 数据持久化

目录 一、将本地目录直接映射到容器里&#xff08;运行成容器时候进行映射&#xff09; 二、数据卷模式 1、创建数据卷 2、查看数据卷列表&#xff0c;有哪些数据卷 3、查看某个数据卷 4、容器目录挂载到数据卷 5、数据卷的优势&#xff1a;多个容器共享一个数据卷 默认…...

Pytest运行指定的case,这个方法真的很高效……

Pytest运行指定的case 在测试工作中&#xff0c;当我们写了较多的cases时&#xff0c;如果每次都要全部运行一遍&#xff0c;无疑是很浪费时间的&#xff0c;而且效率低下。 但是有一种方法可以帮助你快速地运行指定的测试用例&#xff0c;提高测试效率&#xff0c;那就是使用…...

操作系统复习2.3.4-进程同步问题

生产者-消费者 系统中有一组生产者进程和一组消费者进程 两者共享一个初始为空&#xff0c;大小为n的缓冲区 缓冲区没满&#xff0c;生产者才能放入 缓冲区没空&#xff0c;消费者才能取出 互斥地访问缓冲区 互斥要在同步之后&#xff0c;不然会导致想要同步&#xff0c;但由…...

3ds MAX 基本体建模,长方体、圆柱体和球体

3ds MAX基本页面如下&#xff1a; 生成新的几何体在右侧&#xff1a; 选择生成的对象类型即可&#xff0c;以下为例子&#xff1a; 1、长方体建模 选择建立的对象类型为长方形 在 任意一个窗口绘制&#xff0c;鼠标滑动 这里选择左上角的俯视图 松开鼠标后&#xff0c;可以…...

搭建个人博客

个人网站用处有很多&#xff0c;可以写博客来记录学习过程中的各种事&#xff0c;不管是新知识还是踩坑记录&#xff0c;写完就丢在网站上&#xff0c;方便日后复习&#xff0c;也可以共享给他人&#xff0c;让其他人避免踩雷。 当然也不仅限于技术性的文章&#xff0c;生活中有…...

JavaScript进阶(下)

# JavaScript 进阶 - 第3天笔记 > 了解构造函数原型对象的语法特征&#xff0c;掌握 JavaScript 中面向对象编程的实现方式&#xff0c;基于面向对象编程思想实现 DOM 操作的封装。 - 了解面向对象编程的一般特征 - 掌握基于构造函数原型对象的逻辑封装 - 掌握基于原型对…...

基于PyQt5的图形化界面开发——堆栈动画演示

目录 0. 前言1. 了解堆栈2.代码实现3. 演示效果其他PyQt5文章 0. 前言 本文使用 PyQt5制作图形化界面演示数据结构中的堆栈操作 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Python解释器版本&#xff1a;Python3.8 第三方库&…...

2023 年第三届长三角高校数学建模竞赛赛题浅析

为了更好地让大家本次长三角比赛选题&#xff0c;我将对本次比赛的题目进行简要浅析。数模模型通常分为优化、预测、评价三类&#xff0c;而本次数学题目就正好对应着A、B、C分别为优化、预测、评价。整体难度不大&#xff0c;主要难点在于A题的优化以及B、C的数据收集。稍后&a…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...