C++STL——stack,queue

news2025/5/12 2:23:01

stack与queue

  • 前言
  • 容器适配器
  • deque

前言

本篇主要讲解stack与queue的底层,但并不会进行实现,stack的接口
queue的接口 ,关于stack与queue的接口在这里不做讲解,因为通过前面的对STL的学习,这些接口都是大同小异的。

容器适配器

在这里插入图片描述
我们可以发现,stack与queue的第二个参数都是deque。并且在STL里,stack与queue都没有被分配到容器那一分类,,而是容器适配器中。
在这里插入图片描述
容器适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口。即我们的stack与queue是对deque的接口进行了包装而已。我们在前期学习数据结构的时候,stack与queue可以通过数组和链表进行实现,那么对应到C++里面,是可以通过vector与list进行实现的,那么为什么默认使用deque进行实现呢?

deque

deque其命为双端队列,即可以在两端进行插入删除切时间复杂度为O(1),那既然有deque,那么其是否可以取代vector与list呢?当然不行。
先进行补充CPU缓存区的概念:CPU要访问内存中的数据,需要看这个数据是否在缓冲区中,在的话就叫缓存命中,如果没有命中那么就需要先加载到缓存再进行访问缓存。读取数据根据局部性原理(如果一个数据被访问,那么它附近的数据也可能很快被访问。)是不会进行每次只读一个数据的,内存会先把一部分连续的数据读入到缓存区中的。

vector的优点:
1.vector支持随机访问。
2.CPU高速缓存命中率高。因为vector的数据地址是连续的,所以其连续的数据会在缓存区中,所以其高速缓存命中率高
vector的缺点:
1.头部与中部插入与删除数据效率低,因为要挪动数据。
2.扩容后会存在空间浪费的问题
list的优点:
1.任意位置支持O(1)的时间插入删除
2.不存在扩容,也就不会有浪费空间的问题
list的缺点:
1.不支持下标随机访问
2.CPU高速缓存命中率低,因为其内存地址是碎片的。

那么我们的deque是同时兼具两者的优点的,即支持随机访问,CPU高速缓存命中率高,头插的效率高,也没有扩容的问题与list相比其空间利用率也更高。但是deque在vector与list的优点上是比不过的,例如vector的随机访问的效率是比deque快的。
但是deque的致命缺陷就是其遍历非常困难,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。
stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。

那么为什么选择deque作为stack与queue的底层默认容器呢

  1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。
  2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决社区录音应用横屏状态下,录音后无法播放的bug

最近看到社区有小伙伴反映,社区录音应用横屏时,录音后无法播放的问题。现分享解决办法。 社区录音应用的来源:https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-5.0.2-Release/code/SystemFeature/Media/Recorder …

专业级软件卸载工具:免费使用,彻底卸载无残留!

在数字生活节奏日益加快的今天,我们的电脑就像每天都在"吃进"各种软件。但您是否注意到,那些看似消失的程序其实悄悄留下了大量冗余文件?就像厨房角落里积攒的调味瓶空罐,日积月累就会让系统变得"消化不良"。…

JVM对象创建内存分配

对象创建的主要流程: 检查加载类–》分配内存–》初始化–》设置对象头–》实例化,执行init方法。 在内存分配中,虚拟机将为新生对象内存分配 Minor GC : 新生代垃圾收集,特点是频繁,回收速度快; Full GC …

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类边距QMarginsF)

文章目录 类简介方法总览关键说明示例代码 类简介 QMarginsF 用于定义四个浮点型边距(左、上、右、下),描述围绕矩形的边框尺寸。所有边距接近零时 isNull() 返回 True,支持运算符重载和数学运算。 方法总览 方法名/运算符参数返…

STM32实现九轴IMU的卡尔曼滤波

在嵌入式系统中,精确的姿态估计对于无人机、机器人和虚拟现实等应用至关重要。九轴惯性测量单元(IMU)通过三轴加速度计、陀螺仪和磁力计提供全面的运动数据。然而,这些传感器数据常伴随噪声和漂移,单独使用无法满足高精…

机器学习-简要与数据集加载

一.机器学习简要 1.1 概念 机器学习即计算机在数据中总结规律并预测未来结果,这一过程仿照人类的学习过程进行。 深度学习是机器学习中的重要算法的其中之一,是一种偏近现代的算法。 1.2 机器学习发展历史 从上世纪50年代的图灵测试提出、塞缪尔开发…

算法训练营第十三天|226.翻转二叉树、101. 对称二叉树、 104.二叉树的最大深度、111.二叉树的最小深度

递归 递归三部曲: 1.确定参数和返回值2.确定终止条件3.确定单层逻辑 226.翻转二叉树 题目 思路与解法 第一想法: 递归,对每个结点进行反转 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, le…

二叉树的遍历与构造

好想回家,我想回家跟馒头酱玩,想老爸老妈。如果上天再给我一次选择的机会,我会选择当一只小动物,或者当棵大树也好,或者我希望自己不要有那么多多余的情绪,不要太被别人影响,开心点,…

MYSQL服务的使用流程

MYSQL是一个单进程多线程,支持多用户,基于客户机/服务器的关系数据库管理系统。与其他数据库管理系统相比,MYSQL具有体积小,易于安装,运行速度快,功能齐全,成本低廉以及开源等特点。MYSQL可运行…

【java】使用iText实现pdf文件增加水印功能

maven依赖 <dependencies><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.5</version><type>pom</type></dependency> </dependencies>实现代码 前…

socket套接字-TCP

上一篇&#xff1a;socket套接字-UDP&#xff08;下&#xff09;https://blog.csdn.net/Small_entreprene/article/details/147569071?fromshareblogdetail&sharetypeblogdetail&sharerId147569071&sharereferPC&sharesourceSmall_entreprene&sharefromfr…

MiM: Mask in Mask Self-SupervisedPre-Training for 3D Medical Image Analysis

Abstract Vision Transformer在3D医学图像分析的自监督学习&#xff08;Self-Supervised Learning&#xff0c;SSL&#xff09;中展现了卓越的性能。掩码自编码器&#xff08;Masked Auto-Encoder&#xff0c;MAE&#xff09;用于特征预训练&#xff0c;可以进一步释放ViT在各…

【STM32 学习笔记】I2C通信协议

注&#xff1a;通信协议的设计背景 3:00~10:13 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff0c; 不需要USART、CAN等通讯协议的外部收发设备&#xff0c;现在被广…

深入理解卷积神经网络的输入层:数据的起点与预处理核心

内容摘要 本文围绕卷积神经网络输入层展开&#xff0c;详细介绍其在网络中的重要作用&#xff0c;包括接收不同领域数据的形式及传递数据的过程。深入解读数据预处理的关键操作&#xff0c;如去均值、归一化和PCA/白化。助力读者透彻理解输入层&#xff0c;为构建高效卷积神经…

redis bitmap数据类型调研

一、bitmap是什么&#xff1f; redis原文&#xff1a; Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type . This means that bitmaps can be used with string commands, and most importantly with SET and GET. 翻…

LabVIEW 2019 与 NI VISA 20.0 安装及报错处理

在使用 Windows 11 操作系统的电脑上&#xff0c;同时安装了 LabVIEW 2019 32 位和 64 位版本的软件。此前安装的 NI VISA 2024 Q1 版&#xff0c;该版本与 LabVIEW 2019 32 位和 64 位不兼容&#xff0c;之后重新安装了 NI VISA 20.0。从说明书来看&#xff0c;NI VISA 20.0 …

探索 JWT(JSON Web Token):原理、结构与实践应用对比

目录 前言1. 什么是 JWT&#xff1f;2. JWT 的组成结构详解2.1 Header&#xff08;头部&#xff09;2.2 Payload&#xff08;负载&#xff09;2.3 Signature&#xff08;签名&#xff09; 3. JWT 的实际作用3.1 身份认证3.2 信息传递与授权 4. JWT 与 Cookie、API Key 的比较4.…

[docker基础一]docker简介

目录 一 消除恐惧 1) 什么是虚拟化&#xff0c;容器化 2)案例 3)为什么需要虚拟化&#xff0c;容器化 二 虚拟化实现方式 1)应用程序执行环境分层 2)虚拟化常见类别 3)常见虚拟化实现 一&#xff09;主机虚拟化(虚拟机)实现 二&#xff09;容器虚拟化实现 一 消除恐…

Texify - 数学公式OCR转换工具

文章目录 一、项目概览相关资源核心特性 二、安装指南三、使用示例1、命令行转换2、Python API调用3、交互式应用 四、性能基准运行你自己的基准测试 五、局限性 一、项目概览 Texify 是一个OCR模型&#xff0c;可将包含数学公式的图片或PDF转换为Markdown和LaTeX格式&#xf…

RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)

在长期的嵌入式开发实践中&#xff0c;对中断机制的理解始终停留在表面层次&#xff0c;特别当开发者长期局限于纯软件抽象层面时&#xff0c;对中断机制的理解极易陷入"知其然而不知其所以然"的困境&#xff0c;这种认知的局限更为明显&#xff1b;随着工作需要不断…