STL源码刨析_stack _queue

目录

一. 介绍

1. stack 介绍

2. queue 介绍

二. 模拟实现

1. stack 模拟实现

2. queue 模拟实现

三. deque

1. deque 接口

2. 底层


一. 介绍

1. stack 介绍

stack(栈)是一种容器适配器,它提供了一种后进先出(LIFO)的数据结构。以下是关于stack的介绍:

  • 特点:stack是一种具有特定功能的容器,它只能通过顶部(或称为栈顶)进行元素的插入和删除操作。插入操作称为入栈(push),删除操作称为出栈(pop)。对stack的访问受到限制,只能访问栈顶的元素。
  • 使用容器:stack的实现通过在内部使用其他容器来存储元素。默认情况下,STL中的stack使用deque(双端队列)作为底层容器。也可以通过指定其他容器类型来创建自定义底层容器的stack。
  • 基本操作:除了入栈和出栈操作外,stack还提供了其他一些常用的操作,如访问栈顶元素(top)、判断栈是否为空(empty)以及获取栈的大小(size)。
  • 不支持随机访问:与向量(vector)和列表(list)等容器不同,stack不支持通过索引进行随机访问。只能访问栈顶元素,且只能进行入栈和出栈操作。
  • 适用性:stack通常用于一些需要后进先出操作的场景,如逆序遍历、回溯算法、函数调用堆栈等。由于其简洁性和固定操作的特性,在许多算法和数据结构中都能够发挥作用。

总体上,stack是一种功能简单而强大的容器适配器,可用于实现后进先出的数据结构。通过提供入栈、出栈、访问栈顶等操作,stack提供了一种方便且高效的方式来管理数据。

2. queue 介绍

queue(队列)是一种容器适配器,它提供了一种先进先出(FIFO)的数据结构。以下是关于queue的介绍:

  • 特点:queue是一种具有特定功能的容器,它在队尾进行元素的插入操作,而在队头进行元素的删除操作。插入操作称为入队(push),删除操作称为出队(pop)。队列中的元素按照先进先出的顺序进行处理。
  • 使用容器:queue的实现通过在内部使用其他容器来存储元素。默认情况下,STL中的queue使用deque(双端队列)作为底层容器。也可以通过指定其他容器类型来创建自定义底层容器的queue。
  • 基本操作:除了入队和出队操作外,queue还提供了其他一些常用的操作,如访问队头元素(front)、访问队尾元素(back)、判断队列是否为空(empty)以及获取队列的大小(size)。
  • 不支持随机访问:与向量(vector)和列表(list)等容器不同,queue不支持通过索引进行随机访问。只能访问队头和队尾的元素,且只能进行入队和出队操作。
  • 适用性:queue通常用于一些需要先进先出操作的场景,如任务调度、事件处理、缓冲区管理等。通过提供入队、出队、访问队头和队尾的操作,queue提供了一种方便且高效的方式来管理数据。

总体上,queue是一种功能简单而强大的容器适配器,可用于实现先进先出的数据结构。通过提供入队、出队、访问队头和队尾等操作,queue提供了一种方便且高效的方式来管理数据。

二. 模拟实现

我们的 stack 和 queue 都是适配器,所以我们实现就不用很麻烦,我们前面也写过 stack 和 queue,我们知道什么容器适合 stack 和 queue 那么我们这次就使用 vector 来适配 stack 使用 list 来适配 queue。

1. stack 模拟实现

这里我们模拟实现的逻辑就是复用,我们的 stack 的类里面有一个 vector 的对象,但是我们不一定使用 vector 我们还可以使用 list, 所以我们的 stack 的模板可以多传一个参数,来表示我们适配的容器时使用什么容器,然后我们可以复用我们容器的函数,例如我们的 stack 里面有一个 push 但是我们的 stack 只有一个入口和出口,还是后进先出的,所以我们使用的容器是 vector 的话,我们就可以使用 push_back 和 pop_back。

下面我们也就不一个一个介绍了,我们直接看代码~

    template<class T, class Container = vector<T>>class stack{public:stack() {};~stack() {};void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}size_t size(){return _con.size();}T& top(){return _con.back();}bool empty(){return _con.empty();}private:Container _con;};

2. queue 模拟实现

queue 和 stack 其实基本都是一样的,但是我们的 queue 的容器就不能使用 vector 了,其实并不是不能使用,而是使用 vector 的效率很低,因为我们的 vector 需要头删、尾插, 我们知道我们的 vector 的中间或者头部的插入删除都是很慢的,所以我们的 queue 可以使用 list ,我们下main还是直接看代码。

	template<class T, class Container = list<T>>class queue{public:queue() {};~queue() {};void push(const T& val){_con.push_back(val);}void pop(){_con.pop_front();}size_t size(){return _con.size();}T& front(){return _con.front();}T& back(){return _con.back();}bool empty(){return _con.empty();}private:Container _con;};

模拟实现就完了~

三. deque

deque 是一个既可以随机插入删除,也可以支持随机访问的一个容器,但是我们经常宾补怎么使用它,我们的 deque 被作为 stack 和 queue 的默认容器,可是为什么选择 deque 呢?我们下面简单的了解一下 deque。

1. deque 接口

其他的接口我们就不看了,我们主要看一下这些接口 

 我们看到上面,我们的 deque 即提供了头插,头删,还有我们的 operator[],说明我们的 deque 的头插和头删的效率并不慢,而且还提供了我们的 operator[],说明我们的 deque 还支持随机访问,所以说它就是很适合做 stack 和 queue 的容器。

2. 底层

我们这里说一下它的底层,我们的 deque 的底层是一个一个连续的空间,而我们还有一个数组就是专门管理这些连续的空间,就像下面这样

然后我们头插就向最前面的那个数组插入,尾插就像后面的插入,如果满了,就扩容,到管理的那个数组里面在加一个指针,指向一块新的数组,总的来说 deque 是很复杂的,这么两句也说不清楚,但是 deque 其实并不是很重要,我们不需要掌握它,所以了解一下即可

源码在 码云 里面。 

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

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

相关文章

VMware安装Ubuntu(VMware版本17-Ubuntu版本16.0)

VMware安装Ubuntu&#xff08;VMware版本17-Ubuntu版本16.0&#xff09; 一&#xff0c;VMware虚拟机下载官网点击https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/17_0 二&#xff0c;Ubuntu乌班图下载官网点…

VB旅游资源及线路管理系统的设计与实现

旅游作为一个新兴的产业近年来取得了迅速的发展,旅行社如雨后春笋遍布全国各省市、目前旅游行业普遍存在着企业规模小,管理不规范等弱点。因为旅游涉及吃、住、行、游、购、娱等诸多要素,而且这些要素又分散在不同的地域中,一个人不可能全面掌握所有的信息。一旦掌握某方面…

会议OA项目之会议发布(多功能下拉框的详解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OA项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.主要功能点介绍 二.效果展示 三.前…

[极客大挑战 2019]PHP(反序列化)

介绍说明&#xff0c;有备份的习惯&#xff0c;找常见的备份文件后缀名 使用dirsearch进行扫描 dirsearch -u http://f64378a5-a3e0-4dbb-83a3-990bb9e19901.node4.buuoj.cn:81/ -e php-e 指定网站语言 扫描出现&#xff0c;www.zip文件 查看index.php <?php include c…

ES(3)映射关系

文章目录 创建映射关系更具映射关系创建数据查询有什么区别呢&#xff1f; 创建映射关系 创建mapping映射类似于我们创建表结构&#xff0c;规定字段什么类型&#xff0c;多长等基本信息。 先创建 索引 PUT http://127.0.0.1:9200/user 然后创建映射关系 PUT http://127.0.…

[运维] 生成nginx 自签名ssl证书

系统说明 Ubuntu 22.04 STL 服务器版 生成证书 要生成 Nginx SSL 证书&#xff0c;你可以使用 OpenSSL 工具。按照以下步骤操作&#xff1a; 安装 OpenSSL&#xff1a; 如果你的系统上还没有安装 OpenSSL&#xff0c;请使用以下命令安装它&#xff1a; sudo apt update su…

C++-----vector

本期我们来学习C中的vector&#xff0c;因为有string的基础&#xff0c;所以我们会讲解的快一点 目录 vector介绍 vector常用接口 构造函数 sort 迭代器 size&#xff0c;max_size&#xff0c;capacity&#xff0c;empty reserve和resize front和back data insert和…

MATLAB 基于CPD的点云配准 (24)

MATLAB 基于CPD的点云配准 (24) 一、算法简介二、具体使用1.代码(注释详细)2.函数介绍3.使用技巧4.重复叠加配准效果如何一、算法简介 MATLAB 中包含了一种基于CPD的点云配准方法,这里对其进行使用,查看其配准效果,结果来看如上图所示,还是可用的。 二、具体使用 1.代…

快7月底了,让我康康有多少准备跳槽的

前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情影响导致好多人都没拿到offer!现在已经快7月底了&#xff0c;具体金九银十只剩下2个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也…

ElasticSearch 数据迁移工具elasticdump

ElasticSearch 数据迁移工具elasticdump Elasticdump 是一个用于导入和导出 Elasticsearch 数据的命令行工具。它提供了一种方便的方式来在不同的 Elasticsearch 实例之间传输数据&#xff0c;或者进行数据备份和恢复。 使用 Elasticdump&#xff0c;你可以将 Elasticsearch …

allure环境搭建

allure环境搭建 在搭建之前你应该有python、pycharm allure介绍 官网&#xff1a;https://docs.qameta.io/allure/ 英文介绍 Allure Framework is a flexible lightweight multi-language test report tool that not only shows a very concise representation of what have…

关于allure和pycharm的运行模式

案例 新建一个项目allure_mode 新建一个python代码test_allure_001.py 代码如下 import pytest, os def test_001(): assert 1 1 if __name__ __main__: pytest.main([-sv, __file__, --alluredir, ./html, --clean-alluredir]) os.system(fallure se…

【异常解决】postman请求提示Full authentication is required to access this resource

Full authentication is required to access this resource解决办法 报错问题&#xff1a;在使用 postman 测试接口时&#xff0c;该接口需要在 Header 中传入 access_token&#xff0c;实际上也在请求的 Header 中添加上了 access_token 参数&#xff0c;但是服务端还是返回4…

qt与opencv学习记录

qtopencv开发入门&#xff1a;4步搞定环境配置-1_哔哩哔哩_bilibili qtopencv开发入门&#xff1a;4步搞定opencv环境配置2_哔哩哔哩_bilibili 文章内容来自上面两个视频&#xff0c;感谢创作者。 ps&#xff1a;配置环境的过程中&#xff0c;遇到了很多问题&#xff0c;我…

性能测试工具 Jmeter 测试 JMS (Java Message Service)/ActiveMQ 性能

目录 前言 ActiveMQ 介绍 准备工作 编写jndi.properties添加到ApacheJMeter.jar 中 下载 ActiveMQ 配置 Jmeter 进行测试 点对点 (Queues 队列) 配置 Jmeter 进行测试 发布/订阅 (Topic 队列) 配置发布 Publisher 配置订阅 Subscriber 总结 前言 JMeter是一个功能强大…

Windows搭建Nginx实现RTMP转为HLS流

所需软件 nginx-1.7.11.3-Gryphon&#xff08;这个包含必须的RTMP模块&#xff0c;普通的Ngxin没有这个&#xff09;ffmpegVLC 配置Nginx 1为Nginx配置RTMP和HLS 这里定义了一个叫live的RTMP路径。同时设置其开启HLS功能&#xff0c;那么所有推送到这个地址的RTMP流都会自动生…

吴恩达ML2022-用于手写数字识别的神经网络

1 用到的包 导入在这个分配过程中需要的所有包。 Numpy 是使用 Python 进行科学计算的基本软件包。Matplotlib 是在 Python 中绘制图形的流行库。tensorflow是一种流行的机器学习平台。 import numpy as np import tensorflow as tf from tensorflow.keras.models import Se…

阿里云斩获 4 项年度云原生优秀案例丨阿里云云原生 6 月动态

云原生月度动态 ✦ CLOUD NATIVE 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 &#x1f947; 阿里云 S…

IIS Express本地开发测试如何映射到外网访问?

1.IIS Express是什么 IIS Express是为开发人员优化的轻量级、自包含版本的IIS。它具有IIS 7及以上的所有核心功能&#xff0c;以及为简化网站开发而设计的附加功能。 IIS Express&#xff08;跟ASP.NET开发服务器一样&#xff09;可以快速地从硬盘上的某个文件夹上启动网站…

Redis Windows版本安装教程

由于Redis官网不再提供最新版本的Windows安装包&#xff0c;但有些项目根据需要用到最新版本的。 Github仓库redis-windows提供了最新版Windows安装包下载 Redis最新版Windows安装包 https://github.com/redis-windows/redis-windows/releases 1. 命令行启动 cmd 启动 redis…