stack的介绍(可以想象成栈)

1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作

2.stack是作为容器适配器被实现的,容器适配器即是对特点类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素特定容器的尾部(即栈顶)被压入和弹出

3.stack的底层容器可以是任何标准的容器类模板或者是一些其他特定的容器类,这些容器类应该支持以下操作:

empty() /  back  / push_back / pop_back

4.标准容器vector/list/deque均符合这些需求,默认情况下,如果没有stack指定特定的底层容器,就使用deque(等会会介绍)

stack的使用

它是一个适配器,就是通过别的容器转换过来的,只是提供一些特定的接口,让其具有栈的特性

特性:LIFO(last-in first-out,后进先出)

 

可以看到默认使用的模板容器类是deque

 

constructor

stack<int> s;//构造一个空的对象

如果你想指定你的stack使用的底层容器可以stack<int,vector<int>> s;

三种构造方式:1.构造空的stack对象

                         2.使用一个模板容器构造,例如你已经构造vector v1对象了,传参可以传v1

                         3.拷贝构造函数,传一个stack对象

其他重要函数接口

empty():判断是否为空

size():返回栈的元素的个数(返回栈的大小)

top():取栈顶的元素

push():将元素val压入stack中

pop():将栈顶的元素val删除

swap():交换两个栈

总结

1.栈是没有迭代器的,因为栈的特性是先进后出,不能随便访问,所以不支持迭代器

2.如何遍历?先判断为不为空,不为就取栈顶的数据,取完之后pop就行

3.为什么没有析构函数?因为它底层是别的容器,当stack出了作用域自动销毁时会调底层容器的析构函数

queue的介绍(想象成队列):

1.队列是一种容器适配器,专门用于在FIFO(先进先出)中操作,其中从容器的一段插入元素,另一端提取元素

2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从队尾入队列,从对头出队列

3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类,该底层容器至少要满足以下操作

empty/   size  /  front / back /push_back /  pop_front

4.deque/list都满足这些要求,如果没有指定,默认使用deque

queue的使用

队列就是一种容器适配器,是基于一些容器实现的特定的接口以满足先进先出的特性

默认使用deque容器 

几乎和栈没差别,构造函数,还有一些其他函数接口也几乎一样

区别在于,stack使用top取栈顶数据

queue可以取队头也可以取队尾的数据 

front队头,back队尾,top栈顶

而且注意这些都是返回引用,也就是你可以修改

总结:

队列也没有实现迭代器,因为不能支持随机访问,否则就保持不了队列的先进先出的特性

deque的介绍

deque:双端队列,与queue没关系,不要联想到一起,它是一种容器,没有队列先进先出的特性

STL标准库中stack和queue的底层结构:

虽然stack和queue都可以存放元素,但STL并没有将其划入容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的的接口进行了包装,STL中的stack和queue默认使用deque

deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义:可以在头尾双端进行插入和删除操作,且时间复杂度为O(1),与vector相比,头插效率高,不需要挪动数据;与list相比,空间利用率比较高

duque的使用 

 可以看到它支持头插尾插头删尾删 

 可以看到支持迭代器

支持随机访问 

关于deque的使用可以去官网看详细解释,这里只要学明白为什么stack和queue底层用deque

deque的原理

duque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似与一个动态的二维数组,其底层结构如下图所示:

简单来说,deque底层是由一系列固定大小的连续存储块组成,这些存储块叫缓冲区(buffer)

此外,还有一个中控器(通常是一个数组map)存储着指向buffer的指针来管理缓冲区

那它怎么支持随机访问???,这就落在了deque的迭代器身上了,简单来说就是用中控器中的结点,然后用来构造迭代器类型,迭代器里面又有cur first last node等管理,每遍历一个点,cur就往后走,直到last它就遍历结束这一块buffer,遍历完之后node就++就走到下一个结点,然后依次循环下去就是连续遍历

deque的缺陷

与vector相比,deque的优势是:头部插入和删除时,不需要搬移元素,(我们只要在前面多加一个结点,这个结点新开一些buffer,就能解决头插,头删时只要指针指向的位置变就可以)效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是比vector高的,这些可以归结与一个原因,就是vector是连续的物理空间,deque不是连续的,它是通过一个中控器去管理,连续的不够大了就需要重新找一块连续的,而deque不需要

与list相比,deque底层是类似连续的空间,空间利用率高,不需要存储额外的字段,你list每个结点还要存前一个结点和后一个结点的指针

但是deque有一个致命缺陷:不适合遍历,在遍历时,deque的迭代器要频繁的检查是否移动到某段buffer的边界,导致效率低下,而序列式场景中,可能需要经常的遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,这也就是为什么我们没有重点学习deque的接口原因,deque的应用并不多,目前我们能看到的就是stack和queue底层使用deque

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

1.stack和queue不需要遍历(因此其没有迭代器),只需要在固定的一端或者两端进行操作,那deque遍历效率低就在stack和queue这没啥影响了

2.在stack中元素增长时,deque比vector效率高(扩容时不需要搬移大量数据),queue中的元素增长时,deque不仅效率高,而且内存使用率也高,也就是无论头插还是尾插,头删还是尾删,deque的效率也不比list和vector低多少,综合而言,结合了deque的优点,避开了其缺陷

stack和list的模拟实现:

June: 这里包含我的c++和Linux及数据结构https://gitee.com/taifanshu/day2.git已经上传gitee,有需要可以自行拿取,代码有问题可以私聊问

 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【现代深度学习技术】现代循环神经网络06:编码器-解码器架构

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

宏电全新升级单北斗5G电力DTU,为每一公里电力线路注入可靠连接

在配网自动化改造与数字化转型的双重驱动下&#xff0c;宏电股份推出全新升级版H7710-DLWZ系列5G电力DTU&#xff0c;聚焦配网通信链路冗余、国产自主可控、复杂环境适应性三大核心需求&#xff0c;为配电自动化、台区智能运维、分布式能源接入等场景提供高可靠通信底座。 国产…

学习海康VisionMaster之间距检测

一&#xff1a;进一步学习了 今天学习下VisionMaster中的间距检测工具&#xff1a;主要类似于卡尺工具&#xff0c;测量物体的长度或者宽度或者间距 二&#xff1a;开始学习 1&#xff1a;什么是间距检测&#xff1f; 间距测量模块用于检测两特征边缘之间的间距&#xff0c;首…

蓝桥杯 18. 积木

积木 原题目链接 题目描述 小明用积木搭了一个城堡。为了方便&#xff0c;小明使用的是大小相同的正方体积木&#xff0c;并将其搭建在一个 n 行 m 列的方格图上。每个积木占据方格图中的一个小格子。 小明的城堡是立体的&#xff0c;可以将积木垒在其他积木上。当某个格子…

C++负载均衡远程调用学习之基础TCP服务

目录 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 3.LARS的reactor框架的组成部分 4.Lars_reactor的项目目录构建 5.Lars_tcp_server的基础服务开发 6.Lars_tcp_server的accept实现 7.LarsV0.1总结 1.LARS课程模块介绍 2.LARS的功能演示机场景作用 # Lars系统开发 …

EasyExcel使用总结

EasyExcel 文章目录 EasyExcel1、导入1.1、基本方式导入1.导入依赖2. 加载源文件基本语法 3. 读取数据行4. 读取结果 1.2、模型映射导入1.定义实体映射类2. 操作读取基本语法 3. 读取数据行4. 读取结果 1.3、导入类型转换器语法 1.4、导入监听器基本语法&#xff1a; 1.5、多行…

【愚公系列】《Manus极简入门》022-艺术创作顾问:“艺术灵感使者”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

蓝桥杯15届国赛 最小字符串

问题描述 给定一个长度为 N 且只包含小写字母的字符串 S&#xff0c;和 M 个小写字母 c1,c2,...,cM​。现在你要把 M 个小写字母全部插入到字符串 S 中&#xff0c;每个小写字母都可以插入到任意位置。请问能得到的字典序最小的字符串是什么&#xff1f; 输入格式 第一行包含…

【东枫科技】代理英伟达产品:DPU

NVIDIA BlueField-3 DPU 400Gb/s 基础设施计算平台 NVIDIA BlueField -3 数据处理单元 (DPU) 是第三代基础设施计算平台&#xff0c;使企业能够构建从云端到核心数据中心再到边缘的软件定义、硬件加速的 IT 基础设施。借助 400Gb/s 以太网或 NDR 400Gb/s InfiniBand 网络连接…

依图科技C++后端开发面试题及参考答案

请介绍你所了解的分布式系统 分布式系统是由多个独立的计算节点通过网络连接组成的系统&#xff0c;这些节点共同协作以完成特定的任务。分布式系统的设计目标在于提升系统的性能、可扩展性、可靠性和容错性。 从性能方面来看&#xff0c;分布式系统能够把任务分配到多个节点…

Python cv2滤波与模糊处理:从原理到实战

在图像处理领域&#xff0c;滤波与模糊是预处理阶段的两大核心操作&#xff0c;既能消除噪声干扰&#xff0c;又能实现艺术化效果。本文将结合OpenCV的cv2库&#xff0c;系统讲解滤波与模糊的原理及Python实现&#xff0c;带你从理论到实战全面掌握这项技术。 一、滤波与模糊的…

在 Laravel 12 中实现 WebSocket 通信时进行身份验证

在 Laravel 12 中实现 WebSocket 通信时&#xff0c;若需在身份验证失败后主动断开客户端连接&#xff0c;需结合 频道认证机制 和 服务端主动断连操作。以下是具体实现步骤&#xff1a; 一、身份验证流程设计 WebSocket 连接的身份验证通常通过 私有频道&#xff08;Private …

FPGA----基于ZYNQ 7020实现petalinux并运行一个程序

引言&#xff1a;上一节我们讲到了使用Alinx 7020b自带的sd卡中的petalinux进行epics的编译&#xff0c;但此种方案个性化程度不足。如&#xff1a;我们项目需要FPGA侧的配合&#xff0c;那么我们需要重新编译petalinx。 注意&#xff1a;本文的知识点来自下面两篇文章&#x…

Spring Web MVC————入门(1)

今天开始正式带大家学习Spring部分的内容了&#xff0c;大家尝试去弄个专业版嗷&#xff0c;学习起来爽一点 在idea中下载这个插件就行了 我们之后开始创建Spring项目&#xff0c; 蓝色 部分自己起名&#xff0c;type选Maven&#xff0c;其他的默认就好了&#xff0c;之后nex…

Vue3 中用 canvas 封装抽奖转盘组件:设定中奖概率及奖项图标和名称

在 Web 应用开发中&#xff0c;抽奖功能是提升用户参与度的常用手段。使用 Vue3 结合 canvas 技术&#xff0c;我们可以轻松实现一个高度自定义的抽奖转盘组件&#xff0c;不仅能设定中奖概率&#xff0c;还能灵活配置奖项图标和名称。本文将详细介绍该组件的实现原理、步骤&am…

Linux 硬盘和光驱系统管理

一、硬盘与目录的容量 [rootwww ~]# df [-ahikHTm] [目录或档名] 选项与参数&#xff1a; -a &#xff1a;列出所有的档案系统&#xff0c;包括系统特有的 /proc 等档案系统&#xff1b; -k &#xff1a;以 KBytes 的容量显示各档案系统&#xff1b; -m &#xff1a;以 MByt…

2.Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用户&#xff1a;优先使用Caffeine&#xff0c;性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId&…

黑马点评day02(缓存)

2、商户查询缓存 2.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…

头歌禁止复制怎么解除(简单版)

被头歌数据库作业禁止复制整神之后&#xff0c;主啵尝试网上各种解除方法&#xff0c;最后发现一个最简单且最快速的解除方法。 在浏览器中搜索万能复制插件 下载完成之后就可以随便复制粘贴啦 超简单 下载只需几秒

【无基础】小白解决Docker pull时报错:https://registry-1.docker.io/v2/

Docker Compose 启动失败问题解决方案 错误描述 执行 docker compose up -d 时出现以下错误&#xff1a; [] Running 9/9✘ api Error context canceled …