【STL源码剖析-空间配置器】stack、queue简单实现
举头天外望
无我这般人
目录
stack 的概述
stack 的实现
queue 的概述
queue 的实现
契子✨
我们之前学过了 vector、list 这些 STL 的(容器)
而我们今天将要学习空间配置器 -- stack、queue,那什么是空间配置器呢?
简单来讲就是 stack、queue 的底层完成工作具有<修改其他容器所形成的另一种风貌>的性质,所以被称为 adapter (配置器)
stack 的概述
stack 是一种先进后出的结构,它只有一个出口。stack 允许新增元素、移除元素、取得最顶端元素。但除了最顶端之外,没有任何其他方法可以存取 stack 的其他元素。换而言之 stack 不允许有走访行为
将元素推入 stack 的动作叫做 push,将元素推出 stack 的动作叫做 pop
以某种既有容器作为底部,将其介面改变,使符合 [先进后出] 的特性,形成一个 stack,是很容易做到的。比如:vector (顺序栈)、list (链栈)、deque,我们以 vector 为例:vector 是面向开口的资料节点,若以 vector 的头部为封闭的 stack 的底部,尾部为 stack 开口的顶部,就轻而易举地形成了一个 stack 。因此,我们可以将 vector 作为预设情况下的 stack 的底层结构,stack 的实现非常简单这里完整列出:
stack 的实现
template<class T, class Sequence = vector<T> >class stack{public:void push(const T& val){c.push_back(val);}void pop(){c.pop_back();}const T& top() const{return c.back();}bool empty() const{return c.empty();}size_t size() const{return c.size();}private:Sequence c;};
我们发现 stack 会意底层容器完成所有工作,而这种具有 [ 修改/套用 其他容器,形成的另一种风貌] 的性质称之为空间配置器:container adapter
template<class T, class Sequence = vector<T> >
我们右边的赋值行为其实就是传缺省值,对的 ~ 模板也能传缺省值哦
除了能传 vector 还可以传 list、deque(这个容器之后会讲)
如果不传就会默认用 vector 的底层,传了就会用你所指定的底层操作
如果你真的想要传的话 ~ 就是这个酱紫的
stack<int, list<int>> str;
可能有老铁会问:为什么没有看到构造和析构呢?因为不写即正义:
默认构造函数会自动调用自定义类型成员变量的构造函数
默认析构函数会自动调用自定义类型成员变量的析构函数
这里先提一下:
stack 没有迭代器 ! stack 的所有元素的进出都符合 [后进先出] 的条件,只有 stack 的顶端元素,才会被外界取用。所以 stack 不提供走访功能,也不提供迭代器
代码测试:
void stack_test()
{stack<int> str;str.push(1);str.push(2);str.push(3);str.push(4);while (!str.empty()){std::cout << str.top() << " ";str.pop();}return 0;
}
我们知道 stack 有很多与之匹配的容器,我这里就不一一展示了,直接拿过来测试一下呗
void stack_test()
{stack<int,list<int>> str;str.push(1);str.push(2);str.push(3);str.push(4);while (!str.empty()){std::cout << str.top() << " ";str.pop();}std::cout << std::endl;stack<int, deque<int>> arr;arr.push(5);arr.push(6);arr.push(7);arr.push(8);while (!arr.empty()){std::cout << arr.top() << " ";arr.pop();}std::cout << std::endl;
}
queue 的概述
queue 是一种先进先出的结构,它有两个出口。queue 允许新增元素、移除元素、从最底层加入元素、取得最顶端的元素。但除了最低端可以加入、最顶端可以取出,没有任何其他方法可以存取 queue 的其他数据。换而言之 queue 不允许有走访行为,也就不提供迭代器
将元素推入 queue 的动作称为 push、将元素推出 queue 的动作称为 pop
以某种既有的容器作为底层,将其介面改变,使其符合 [先进先出] 的特性,形成一个 queue 很容易做到。比如:list、deque(deque 是一个双端队列,可以在队列的两端进行元素的插入和删除操作),我们若以 list 为底部为入口增数据,头部为出口删数据,就可以形成 queue。我们可以将 list 作为预设情况下的 queue 的底层结构,queue 的实现非常简单这里完整列出:
queue 的实现
template <class T, class Sequence = list<T> >class queue{public:bool empty() const{return c.empty();}size_t size() const {return c.size();}T& front(){return c.front();}const T& front() const{return c.front();}T& back(){return c.back();}const T& back() const{return c.back(); }void push(const T& x){c.push_back(x); }void pop() {c.pop_front(); }private:Sequence c;};
这就完成了 ~ 是不是很简单 -- 因为空间配置器的底层都是依据某种容器,简单来说就是容器套个壳,功能受到了限制罢了
代码测试:
void queue_test()
{queue<int> str;str.push(1);str.push(2);str.push(3);str.push(4);while (!str.empty()){std::cout << str.front() << " ";str.pop();}
}
有不对的地方欢迎指出 ~ ✨
相关文章:

【STL源码剖析-空间配置器】stack、queue简单实现
举头天外望 无我这般人 目录 stack 的概述 stack 的实现 queue 的概述 queue 的实现 契子✨ 我们之前学过了 vector、list 这些 STL 的(容器) 而我们今天将要学习空间配置器 -- stack、queue,那什么是空间配置器呢? 简单来讲就是…...

VR导航的实现原理、技术优势和应用场景
VR导航通过虚拟现实技术提供沉浸式环境,结合室内定位技术实现精准导航。目前,VR导航已在多个领域展现出其独特的价值和潜力,预示着智能导航系统的未来发展。 一、实现原理 VR导航技术依托于虚拟现实(VR)和室内定位系统。VR技术利用计算机模…...

淘宝镜像的https证书过期
错误原因: 淘宝镜像过期 早在 2021 年,淘宝就发文称,npm 淘宝镜像已经从 http://registry.npm.taobao.org 切换到了 http://registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务(直到 HTTPS 证书到期才真正不能用了…...

VSCODE 常用快捷键
快捷按键 注释 CTRL /CTRL KSHIFT ALT A取消注释 CTRL /CTRL KSHIFT ALT A搜索文件 Ctrl P移动到某一行 Ctrl g打开一个新窗口 Ctrl Shift N关闭窗口 Ctrl Shift W新建文件 Ctrl N文件间切换 Ctrl Tab全部文件搜索 Ctrl Shift F全屏 F11 打开文件出现中文乱码 文件右下角…...

医院该如何应对网络安全?
在线医生咨询受到很多人的关注,互联网医疗行业的未来发展空间巨大,但随着医院信息化建设高速发展 医院积累了大量的患者基本信息、化验结果、电子处方、生产数据和运营信息等数据 这些数据涉及公民隐私、医院运作和发展等多因素,医疗行业办…...

【qt】多窗口开发
多窗口开发 一.应用场景二.嵌入的窗口1.设计Widget窗口2.创建窗口3.添加窗口4.总代码 三.独立的窗口1.创建窗口2.显示窗口 四.总结 一.应用场景 多窗口,顾名思义,有多个窗口可以供我们进行操作! 截个小图,你应该就知道了 OK,话不多说,直接开干,先来设计我们的主窗口 需要蔬菜…...
iOS Hittest 机制和实际应用
Hittest 机制原理 hitTest的原理就是,当我们点击的时候,会触发 window的 hittest方法,在该方法中会首先使用point inside方法判断 点击的地方是否在window范围内,如果在的话,就倒序遍历姿子视图,然后将poi…...
C# 工厂模式学习
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,而不是通过具体类来实例化对象。工厂模式可以将对象的创建过程封装起来,使代码更具有灵活性和可扩展性。 工厂模式有几种常见的实现方式&…...

AI生成微信职业头像
加油,新时代打工人! 真别说,还挺好看的 https://chatglm.cn/main/alltoolsdetail...
遥感图像的深度学习的任务类型
在遥感图像的深度学习任务中,利用深度学习技术处理和分析遥感图像已经成为一个重要的研究方向。遥感图像来自卫星、无人机等设备,包含了丰富的地球表面信息。以下是遥感图像深度学习中的主要任务类型: 1. 图像分类(Image Classif…...

162.二叉树:填充每个节点的下一个右侧节点指针(力扣)
代码解决 /* // Definition for a Node. class Node { public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _…...
NLP(20)--知识图谱+实体抽取
前言 仅记录学习过程,有问题欢迎讨论 基于LLM的垂直领域问答方案: 特点:不是通用语料;准确度要求高,召回率可以低(转人工);拓展性和可控性(改变特定内容的回答…...

【mysql数据库】mycat中间件
MyCat 简介 Mycat 是数据库 中间件 。 1、 数据库中间件 中间件 是一类连接软件组件和应用的计算机软件, 以便于软件各部件之间的沟通 。 例子 Tomcat web 中间件 。 数据库 中间件 连接 java 应用程序和数据库 2、 为什么要用 Mycat ① Java 与数据库紧耦合 …...

满帮集团 Eureka 和 ZooKeeper 的上云实践
作者:胡安祥 满帮集团,作为“互联网物流”的平台型企业,一端承接托运人运货需求,另一端对接货车司机,提升货运物流效率。2021 年美股上市,成为数字货运平台上市第一股。根据公司年报,2021 年&a…...

ubuntu中彻底删除mysql (配置文件删除可选)
ubuntu中彻底删除mysql (配置文件删除可选) 对于此类即搜即用的分享文章,也不过多赘述,直接依次按照下面的操作执行即可: 一、删除 mysql 数据文件 sudo rm /var/lib/mysql/ -R二、删除 mysql 配置文件 sudo rm /etc/mysql/ -R三、查看 m…...

根据模板和git commit自动生成日·周·月·季报
GitHub - qiaotaizi/dailyreport: 日报生成器 GitHub - yurencloud/daily: 程序员专用的日报、周报、月报、季报自动生成器! config.json: { "Author": "gitname", "Exclude": ["update:", "add:", "…...

matlab GUI界面设计
【实验内容】 用MATLAB的GUI程序设计一个具备图像边缘检测功能的用户界面,该设计程序有以下基本功能: (1)图像的读取和保存。 (2)设计图形用户界面,让用户对图像进行彩色图像到灰度图像的转换…...
MyBatis 面试题
一、什么是 Mybatis? 1、Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。 …...

C#根据数据量自动排版标签的样例
这是一个C#根据数据量自动排版标签的样例 using System; using System.Collections.Generic; using System.Data.SqlClient; using System.Drawing; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using HslCommuni…...
【网络安全】Web安全基础 - 第一节:使用软件及环境介绍
VMware VMware,是全球云基础架构和移动商务解决方案的佼佼者。 VMware可是一个总部位于美国加州帕洛阿尔托的计算机虚拟化软件研发与销售企业呢。简单来说,它就是通过提供虚拟化解决方案,让企业在数据中心改造和公有云整合业务上更加得心应…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...