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

C++STL——stack,queue

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不仅效率高,而且内存使用率高

相关文章:

C++STL——stack,queue

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

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

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

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

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

前端开发实战:用React Hooks优化你的组件性能

问题背景 在前端开发中,React组件的性能优化是一个常见挑战。尤其是当组件逻辑复杂或数据频繁更新时,性能问题尤为突出。本文将介绍如何利用React Hooks(如useMemo和useCallback)来优化组件性能。 解决方案 useMemo:用…...

JVM对象创建内存分配

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

华为云Git使用与GitCode操作指南

目录 1 概述 1.1 背景介绍 1.2 案例流程 1.3 资源总览 2 GitCode基础使用 2.1 GitCode注册 2.2 项目创建 3 云主机上Git常用基础命令使用 3.1 Git工具安装检查 3.2 git config 全局设置 3.3 git clone 创建仓库 3.4 git init 仓库初始化 3.5 git add/remove 文件添…...

标量/向量/矩阵/张量/范数详解及其在机器学习中的应用

标量(Scalar)、向量(Vector)、矩阵(Matrix)、张量(Tensor)与范数(Norm)详解及其在机器学习中的应用 1. 标量(Scalar) 定义&#xff1…...

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…...

二叉树的遍历与构造

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

Python+OpenCV实现手势识别与动作捕捉:技术解析与应用探索

引言:人机交互的新维度 在人工智能与计算机视觉技术飞速发展的今天,手势识别与动作捕捉技术正逐步从实验室走向大众生活。通过Python的OpenCV库及MediaPipe等工具,开发者能够以较低门槛实现精准的手部动作识别,为虚拟现实、智能家…...

MYSQL服务的使用流程

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

华为云API、SDK是什么意思?有什么区别和联系?

目录 一、API:像菜单 + 打电话点餐 📌 本质解释: 🔧 操作方式(偏底层): 🍱 类比举例: 二、SDK:像外卖App(美团/饿了么)自动点餐 📌 本质解释: 🔧 操作方式(偏上层): 🍱 类比举例: 三、联系:SDK 是对 API 的“封装与简化” 四、操作实例对…...

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

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

Python爬虫实战:获取艺恩娱数最新电影舆情数据并分析,为影院排片做参考

一、引言 在电影行业蓬勃发展的当下,了解影片的各项指数对于票房宣发排片起着至关重要的作用。艺恩娱数网站作为电影行业重要的数据平台,提供了丰富且有价值的电影相关数据。然而,直接从该网站获取数据面临诸多挑战。Python 作为一种功能强大、应用广泛的编程语言,拥有众多…...

Linux指令入门:DevOps与SRE视角

文章目录 Linux指令入门&#xff1a;DevOps与SRE视角一、Linux基础命令概述二、文件系统操作命令1. 文件与目录基本操作2. 文件查看与编辑3. 文件压缩与归档 三、进程管理命令1. 进程查看与控制2. 服务管理&#xff08;Systemd&#xff09; 四、网络管理命令1. 网络连接与诊断2…...

socket套接字-TCP

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

Ctrl + D是如何与内核文件结束符对应的?如何模拟文件结束符?数字中间为什么不能插入空格或逗号?丰富多彩的语句结束符或分隔符?语句结束符?

目录 Ctrl D是如何与内核文件结束符对应的? 如何模拟文件结束符? 哪些编程语言支持数值中插入分隔符更容易看清楚? 下划线分隔符 数字中间为什么不能插入空格或逗号? 丰富多彩的语句结束符或分隔符 误用分号 语句结束符 不同语言的结束符 更改语句结束符 Ctrl …...

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;现在被广…...

【java】jdk8及以后的时间类总结

目录 1. LocalDate 2. LocalTime 4. ZonedDateTime 5. Duration 6. Period 7. DateTimeFormatter 1. LocalDate 说明&#xff1a;表示不带时区的日期&#xff08;年、月、日&#xff09;&#xff0c;不可变且线程安全。 import java.time.LocalDate;public class Local…...

深入理解 Istio 的工作原理 v1.26.0

解读最新版本的 Istio 源码确实是一项庞大的工程&#xff0c;但我可以为你梳理出一个清晰的脉络&#xff0c;并指出关键模块和代码路径&#xff0c;帮助你深入理解 Istio 的工作原理。 我们主要关注 Istio 的核心组件 Istiod 和数据平面的 Envoy Proxy。 前提&#xff1a; Go…...

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

内容摘要 本文围绕卷积神经网络输入层展开&#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. 翻…...

如何用数学思想填报高考志愿

人一辈子有很多四年&#xff0c;但是很少有哪个四年对你一生的影响能超过大学这四年。 从18岁到22岁的这几年&#xff0c;是一个人真正成年的过程&#xff0c;很多人会在这段时间里认识一生的朋友&#xff0c;谈第一次真正的恋爱&#xff0c;第一次离开父母&#xff0c;自己生…...

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.…...

互联网大厂Java求职面试:云原生与AI融合下的系统设计挑战-1

互联网大厂Java求职面试&#xff1a;云原生与AI融合下的系统设计挑战-1 在当今云计算和人工智能迅猛发展的背景下&#xff0c;互联网大厂对Java工程师的要求已从传统的单体架构和业务逻辑处理&#xff0c;转向了更复杂的云原生架构设计、AI模型集成以及高并发系统的性能优化能…...