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乌班图下载官网点…

会议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…

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…

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

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

【LeetCode周赛】2022上半年题目精选集——动态规划

文章目录 2140. 解决智力问题解法1——倒序DP&#xff08;填表法&#xff09;解法2——正序DP&#xff08;刷表法&#xff09;⭐⭐⭐ 2167. 移除所有载有违禁货物车厢所需的最少时间⭐⭐⭐解法1——前缀和⭐⭐⭐⭐⭐解法2——前后缀分解 动态规划代码1——看了思路之后自己写的…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

星火认知大模型,让我感受到了国产AI的崛起

文章目录 一、申请和测试代码二、实测GPT4.0和星火认知大模型的对比2.1 测试网站2.2 经典问题提问对比2.3 代码问题提问对比2.4 论文问题对比2.5 评价 一、申请和测试代码 在我之前的一篇文章中&#xff0c;我分享了如何申请星火认知大模型的内测&#xff0c;并提供了一份可以…

java项目之班级同学录网站(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的班级同学录网站。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&a…

UE5 DLC

前言 在网上找了很多文档,并没有介绍DLC如何创建,但是对比多篇文档后,可以总结为DLC也是Pak包,本质上还是补丁包,B站上有一篇视频介绍了: [UE4]如何在虚幻4游戏里添加DLC的教程(中英机翻)_哔哩哔哩_bilibili 但是也感觉不对,因为要改Build.cs文件。故研究了一下插件式…