c++:stack与deque
1.stack使用
1.1empty
作用:判断栈中是否为空
我们看到这里s1初始化的时候是空初始化,所以用empty来判断出的就是空的栈
1.2size
size的作用就是判断栈中的数据个数
1.3push
与vector,string,list不同的是,stack中没有头插尾插的概念
因为栈有一个原则:后进先出。也就是他像杯子装水一样限制了我们只能从唯一接口进行数据插入与删除。所以也就自然没有push_back了,只有push
通过push,我们成功给栈插入了一个1
1.4pop
在pop前,栈中有一个1
pop之后栈中的1被删掉了
1.5top
我们按照顺序将1,2,3,4依次插入栈中,也就是说4应该是最后进栈的,他就是栈顶数据
2.容器适配器
适配器:是一种设计模式,他的目的是将一个接口转换成客户希望的另一个接口
容器适配器:就是将一个容器转换成另外一种容器
eg:vector/list -> stack
(1)只支持一种容器的写法
这里是使用数组实现栈,由于底层锁死了vector,所以要改成链表实现栈就很麻烦了,底层的都要改动
(2)支持多种容器的写法
这里面我们就可以将其他各种容器给到模板参数container,达到可以切换多种容器的目的
eg: m_stack<int,list<int>>
3.利用容器适配器实现stack
这里我们直接复用大部分容器中都有的方法来实现栈
注意:函数参数和模板参数是类似的,只不过函数参数传的是值,而模板参数传的是类型
所以我们的其中一种使用就是:my_stack<int, vector<int>> m;
不过我们其实需要给container一个默认容器类型,就像给函数参数一个缺省值一样。
4.deque
标准库中的栈默认的容器既不是数组,也不是链表,而是用deque。
vector:
优势:可以实现数据的随机高效访问
劣势:插入删除效率较低,扩容会有一定空间浪费
list:
优势:可以实现高效的随机存储,没有空间浪费
劣势:不支持下标随机访问
deque结合了数组随机读取的优势和链表插入删除方便的优势,但是也带来了一些新的问题
当只需要查找和头尾数据操作的时候,deque是可以完美替代vector与list的,除了这种情况,deque就会比较麻烦了
示意图:
vector是一段连续的长空间,存储所有数据
list是一个个断开的空间,存储一个个数据
deque是由中控数组与存储数组组成的,中控数组存储着存储数组的指针,负责从一个存储数组跳到另一个存储数组访问,存储数组是一大段连续空间存储数据,且存储数组的长度是一样的
接下来看看他的迭代器
迭代器由四个指针组成,其中三个是一级指针,一个是二级指针。
cur指向当前访问到的数据,first指向存储数组的首元素位置,last指向存储数组的尾元素位置
node指向中控数组中指向当前存储数组的指针
下面是更完整的结构
由于deque的应用场景是头尾的插入删除,所以这里主要有两个迭代器,分别是start与finish,他们分别是指向中控数组的第一个元素的指针,与最后一个元素的指针
(1)遍历
从first的cur开始遍历,不涉及存储数组转换就是cur++,涉及存储数组变化就改变node指针的指向,然后根据node指针取得first指针的地址并更新cur,再根据存储数组固定的元素个数推断出last的指针地址,这样就完成了迭代器的更新。
(2)尾部插入数据
数据没满:直接插入数据并cur++
数据满了:开一个新的存储数组,将数据存在新数组开头,更新finish迭代器
(3)头部插入数据
存储数组满了:开一个新的数组,把数据存在新数组的结尾,更新start迭代器
存储数组没满:直接插入,然后cur--
(4)下标随机访问
i/size求出在第几个存储数组,i%size求出在存储数组的第几个位置
插入与删除:
他们需要把pos后面的数据跨存储数组移动,效率很低
下标随机访问:
略低于vector
头尾插入删除:
优于vector和list排序:
用vector
5.priority_queue
priority_queue是优先级队列,他的底层是利用堆来实现的,默认大数据优先级更高。
5.1框架搭建
我们还是使用容器适配器来构建该容器
5.2插入
由于底层是堆,所以我们的插入是先直接插入到堆尾,然后向上调整,最后完成一个堆结构插入
5.3删除
堆的删除:先把首尾元素值交换,然后删除尾元素,接着向下调整
向下调整用到了假设法:我们先假设左孩子是较大的,然后进行判断,若实际上右孩子更大,则让child++。不过要注意,进行右孩子的访问前,需要确定有右孩子
5.4仿函数使用
我们前面实现的插入删除都是针对大堆的(大数据优先级高的),那如果我们要针对小堆,怎么实现?
方法一:在类中直接修改代码比较逻辑
方法二:使用仿函数
方法一的修改需要改动底层,且不适合做成模板,方法二可以写成模板,改动比较逻辑可以从接口处改动,不用动底层
接下来我们实现lessfuc仿函数
其实仿函数就是一个类中重载()运算符,然后在这个重载函数中实现函数的功能
由于lessfuc是大的数据优先级高,所以我们需要注意向上和向下调整中parent和child数据的位置
这里把parent的数据放在child之前,若parent<child,则交换数据,满足大数据优先
这里再讲解一个仿函数的应用
假设我们有一个date类,我们的比较逻辑是指针直接比较,但是我们希望的是指针指向的内容大小比较,我们就可以写一个仿函数,重载()运算符,实现指向内容的比较,然后传仿函数给date类
综上:仿函数可以增加一些代码的可变性,通过传不同的仿函数实现一个类兼容多种情况
相关文章:
c++:stack与deque
1.stack使用 1.1empty 作用:判断栈中是否为空 我们看到这里s1初始化的时候是空初始化,所以用empty来判断出的就是空的栈 1.2size size的作用就是判断栈中的数据个数 1.3push 与vector,string,list不同的是,stack中没有头插尾插的概念 因为栈有一个原则&…...
Linux-C/C++《C++/1、C++基础》(C++语言特性、面向对象等)
这里主要介绍概念为主,主要介绍 C与 C 语言中常用的不同点,和一些新的变化。其中不会去说指针、数据类型、变量类型、判断和循环等这些知识,这些和C 语言基本是一样使用的。我们主要学习 C的面向对象编程,对学习 Qt 有很大的帮助。…...
交易所开发:数字市场的核心动力
数字资产交易所作为连接用户与市场的核心枢纽,已成为推动数字经济发展的关键引擎。其开发不仅需要技术创新,还需兼顾用户体验、合规安全与生态构建,以下是交易所开发的核心要素与实践路径分析: 一、交易所的核心定位与技术架构…...
Spring Boot 应用(官网文档解读)
Spring Boot 启动方式 SpringApplication.run(MyApplication.class, args); Spring Boot 故障分析器 在Spring Boot 项目启动发生错误的时候,我们通常可以看到上面的内容,即 APPLICATION FAILED TO START,以及后面的错误描述。这个功能是通过…...
.Net面试宝典【刷题系列】
文章目录 1、JIT是如何工作的2、值类型和引用类型的区别3、解释泛型的基本原理4、如何自定义序列化和反序列化的过程5、如何使用 IFormattable 接口实现格式化输出6、请解释委托的基本原理7、什么是链式委托8、请解释反射的基本原理和其实现的基石9、如何利用反射来实现工厂模式…...
Unity游戏制作中的C#基础(3)加减乘除算术操作符,比较运算符,逻辑与,或运算符
1. 基本算术运算符 算术运算符主要用于对数值类型(整型和浮点型)进行基本的数学运算。以下是常见的算术运算符及其说明: 运算符描述示例结果加法运算符,用于两个数相加,也可用于字符串连接int a 5 3; string str &…...
如何优化 Webpack 的构建速度?
优化 Webpack 的构建速度是现代前端开发中至关重要的任务。随着项目规模的扩大,构建时间可能会显著增加,影响开发效率。以下是一些实用的方法和策略,以帮助你优化 Webpack 的构建速度。 一、使用生产模式和开发模式 1. 生产模式与开发模式 …...
win10把c盘docker虚拟硬盘映射迁移到别的磁盘
c盘空间本身就比较小、如果安装了docker服务后,安装的时候没选择其他硬盘,虚拟磁盘也在c盘会占用很大的空间,像我的就三十多个G,把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…...
conda 配置源
无论是Anaconda vs Miniconda vs Miniforge 中的哪个,只要使用conda就涉及源,换源的目的是为了加速包的获取 修改配置文件 通过修改用户目录下的 .condarc 文件来使用 不同系统下的 .condarc 目录如下: Linux: ${HOME}/.condarcmacOS: ${…...
使用nvm管理node.js版本,方便vue2,vue3开发
在Vue项目开发过程中,我们常常会遇到同时维护Vue2和Vue3项目的情况。由于不同版本的Vue对Node.js 版本的要求有所差异,这就使得Node.js 版本管理成为了一个关键问题。NVM(Node Version Manager)作为一款强大的Node.js 版本管理工具…...
Linux离线环境安装miniconda并导入依赖包
一、实现目标 在Linux离线环境中安装miniconda后,将联网环境中的依赖包导入到离线miniconda中,使得python项目在Linux离线环境中正常运行 二、前置条件 设备需要拷贝的文件联网Linux虚拟机miniconda安装包、依赖包、项目文件离线Linux虚拟机/ 三、实…...
【opencv】图像基本操作
一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCCALE:灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…...
泛微OA编写后端Rest接口
泛微OA编写后端Rest接口 前言 具体实现 运行结果 注意要点 总结 前言 在泛微E9中,可以通过注解的方式来编写对外的接口,之前的版本都是通过编写servlet类,然后在web.xml文件中将这个类和访问路径进行编辑之后才好在浏览器中通过输入对应…...
AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...
002 SpringCloudAlibaba整合 - Feign远程调用、Loadbalancer负载均衡
前文地址: 001 SpringCloudAlibaba整合 - Nacos注册配置中心、Sentinel流控、Zipkin链路追踪、Admin监控 文章目录 8.Feign远程调用、loadbalancer负载均衡整合1.OpenFeign整合1.引入依赖2.启动类添加EnableFeignClients注解3.yml配置4.日志配置5.远程调用测试6.服务…...
计算机视觉之图像处理-----SIFT、SURF、FAST、ORB 特征提取算法深度解析
SIFT、SURF、FAST、ORB 特征提取算法深度解析 前言 在图像处理领域亦或是计算机视觉中,首先我们需要先理解几个名词: 什么是尺度不变? 在实际场景中,同一物体可能出现在不同距离(如远处的山和近处的树)…...
DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署
DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台,通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括:深度学习模型搜索&…...
elabradio入门第八讲——帧同步技术
一、帧同步的相关知识 数字通信中, 为了使接收到的码元能够被理解,需要知道其如何分组。一般说来,接收端需要利用帧同步码去划分接收码元序列。将标志码组开始位置的帧同步码插入于一个码组的前面,如图所示。 这里的帧同步码是一…...
站长工具SEO综合查询是什么?怎么利用站长工具SEO综合查询
你的网站是否像一辆没有仪表盘的车?明明在狂奔却不知道油耗、时速、故障灯状态?2025年SimilarWeb数据显示,83%的站长因缺乏数据化诊断工具,导致50%以上的流量白白流失。今天我们用“修车师傅”的视角,拆解SEO综合查询工…...
超简单理解KMP算法(最长公共前后缀next数组、合并主子串、子串偏移法)
KMP算法理解 最长公共前后缀next合并主子串子串偏移 参考b站:子串偏移、合并主子串 最长公共前后缀next 这个概念是一个trick,帮助我们记录遍历了一遍的数组的相似特性,想出来确实很nb,我也不理解逻辑是怎么想出来的。 字符串的…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...





















