模拟实现STL的stack、queue、deque等的介绍

文章目录

  • 前言
  • 一、模拟实现stack
  • 二、模拟实现queue
  • 三、 deque
  • 总结


前言

模拟实现STL的stack、queue、deque等的介绍


一、模拟实现stack

STL的stack是通过增加一个容器的模板参数,不直接实现栈,让容器存储数据,并调用容器的接口实现栈

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

此时使用stack时,需要传两个模板参数一个是数据类型,一个是容器的类型

  • 这种方式可以很方便的切换 vector 栈和 list 栈
void test1()
{hhb::stack<int, vector<int>> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);st1.push(5);while (!st1.empty()){cout << st1.top() << " ";st1.pop();}cout << endl;cout << st1.size() << endl;hhb::stack<int, list<int>> st2;st2.push(1);st2.push(2);st2.push(3);st2.push(4);st2.push(5);while (!st2.empty()){cout << st2.top() << " ";st2.pop();}cout << endl;cout << st2.size() << endl;
}

在这里插入图片描述

二、模拟实现queue

STL的queue是通过增加一个容器的模板参数,不直接实现队列,让容器存储数据,并调用容器的接口实现队列

namespace hhb
{template <class T, class Container>class queue{public:void push(const T& x){_con.push_back(x);}void pop(){//_con.erase(_con.begin());_con.pop_front();}T& front(){return _con.front();}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};
}

使用queue需要传入两个模板参数,一个是数据类型,一个是容器类型

  • 可以使用 list 队列 也可以使用 vector 队列, 但是不建议使用vector队列,因为队列是先进先出(FIFO),需要头删,vector 的头删效率不高,只能使用erase函数来实现头删。
void test2()
{//hhb::queue<int, vector<int>> q1;//q1.push(1);//q1.push(2);//q1.push(3);//q1.push(4);//q1.push(5);//while (!q1.empty())//{//	cout << q1.front() << " ";//	q1.pop();//}//cout << endl;//cout << q1.size() << endl;hhb::queue<int, list<int>> q2;q2.push(1);q2.push(2);q2.push(3);q2.push(4);q2.push(5);while (!q2.empty()){cout << q2.front() << " ";q2.pop();}cout << endl;cout << q2.size() << endl;
}

在这里插入图片描述

三、 deque

这是一个非常全面的容器,它的接口如下:
在这里插入图片描述

既可以下标访问,又可以头插头删,尾插尾删。
但是它的下标访问效率不高,而且中间插入数据效率很低。
因为deque的结构是一个中控(指针数据)存每个数组的指针,每个数组一样的大小如下:
在这里插入图片描述

基于以上的性质它只适合头插头删除,尾插尾删,所以它可以很好地适配栈和队列的容器, 所以可以用deque来作为stack 和 queue 的容器模板的缺省参数。

namespace hhb
{template <class T, class Container = deque<T>> // 缺省参数class stack{public:void push(const T& x){_con.push_back(x);}// ....private:Container _con;};}

namespace hhb
{template <class T, class Container = deque<T>> // 给定缺省参数class queue{public:void push(const T& x){_con.push_back(x);}// .....private:Container _con;};
}

此时,使用stack 和 queue 只需要一个模板参数即可,即数据的类型。

void test3()
{hhb::stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;cout << st.size() << endl;hhb::queue<int> q;q.push(1);q.push(2);q.push(3);q.push(4);q.push(5);while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;cout << q.size() << endl;
}

在这里插入图片描述


总结

模拟实现STL的stack、queue、deque等的介绍

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

环形链表问题——力扣141,142

环形链表问题——力扣141&#xff0c;142 141.判断链表是否带环142.给定一个链表&#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 NULL 141.判断链表是否带环 这道题不能用比较链表中的值来判断是否带环&#xff0c;因为链表中不同节点的值可以相同…

Java免税购物商城:Spring Boot技术实现

第二章 系统开发关键技术 2.1 JAVA技术 Java主要采用CORBA技术和安全模型&#xff0c;可以在互联网应用的数据保护。它还提供了对EJB&#xff08;Enterrise JavaBeans&#xff09;的全面支持&#xff0c;java servlet AI&#xff0c;JS&#xff08;java server ages&#xff09…

matlab绘制二维云图,划分区域,并显示每个区域的均值

绘制成图如下&#xff1a; 代码如下&#xff1a; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建绘图的数据 ax0;bx1; ay0;by1; nx100; %数据的x轴点数 ny100; %数据的y轴点数 hx(bx-ax)/(nx-1); hy(by-ay)/(ny-1); Xax:hx:bx; Yay:hy:by; da…

有趣的Python-turtle

1 介绍 turtle 是 Python 中用来绘图的标准库&#xff08;Python解释器在安装后import直接使用&#xff09;&#xff0c;它简单且有趣&#xff0c;作为 Python初学者 都可以将它作为第一个学习对象&#xff0c;培养程序学习的兴趣&#xff0c;建立编程带来的成就感&#xff0c…

网络安全-webshell绕过,hash碰撞,webshell绕过原理

目录 一、题目 1.1 1.2 1.3 1.4 1.5 二、绕过动态检测引擎的一次尝试 三、一个比赛中的webshell 四、webshell绕过的原理以及哈希碰撞 五、JSP解释流程导致的绕过&#xff08;QT比赛&#xff09; 5.1环境 5.2例子 一、题目 这里我们通过几道题目来给大家讲解 1.…

Springboot3 + MyBatis-Plus + MySql + Uniapp 实现商品规格选择sku(附带自设计数据库,最新保姆级教程)

Springboot3 MyBatis-Plus MySql Uniapp 实现商品规格选择sku&#xff08;附带自设计数据库&#xff0c;最新保姆级教程&#xff09; 1、效果展示2、数据库设计2.1 商品表2.2 商品价格和规格中间表2.3 商品规格表 3、后端代码3.1 model3.2 vo3.3 mapper、server、serverImp3…

前端-javaScript:jquery补充

jquery绑定事件的方式 1.直接使用事件函数 &("div").click(function(){alert(1)}) 2.用统一的on函数绑定事件 on(事件类型&#xff0c;事件函数) $("div").on("click",function(){alert(2)}) 事件类型以参数的类型传递 --->可以同时绑…

go webapi上传文件 部属到linux

go厉害的地方&#xff0c;linux服务器上无需安装任务依赖就可以运行&#xff0c;大赞&#xff01; 一、编译 #在Goland中cmd中执行 go env -w GOARCHamd64 go env -w GOOSlinux go build main.go # 切换回来 否则无法运行 go env -w GOOSwindows go run main.go 拷贝到linux服…

C++——关联式容器(4):set和map

在接触了诸如二叉搜索树、AVL树、红黑树的树形结构之后&#xff0c;我们对树的结构有了大致的了解&#xff0c;现在引入真正的关联式容器。 首先&#xff0c;先明确了关联式容器的概念。我们之前所接触到的如vector、list等容器&#xff0c;我们知道他们实际上都是线性的数据结…

使用pe工具制作ubuntu备份系统和还原系统

使用pe工具制作ubuntu备份系统和还原系统 备份系统还原系统修复磁盘教程修复引导教程为什么使用pe工具 1,因为我个人觉得这个工具实现起来比systemback软件操作起来报错少些,而且装的快,其他系统同理 实验准备 1,一个电脑,一个pe启动U盘 备份系统 插入U盘,开机进入pe系…

[JavaEE] UDP协议

目录 再谈端口号 一、端口号的划分 二、UDP协议 三、UDP的特点 再谈端口号 一、端口号的划分 0-1023&#xff1a;知名端口号&#xff0c;端口号固定&#xff0c;其中包括HTTP&#xff0c;FTP&#xff0c;SSH等广为使用的应用层协议。 1024-65535&#xff1a;操作系统动态分…

数据结构|二叉搜索树

&#x1f36c; mooridy-CSDN博客 &#x1f36c;数据结构专栏&#xff08;更新中&#xff09; 目录 1. ⼆叉搜索树的概念 2. ⼆叉搜索树的性能分析 3.⼆叉搜索树key和key/value key搜索场景 key/value搜索场景 4. 二叉搜索树的代码实现 4.1 ⼆叉搜索树的插⼊ 4.2 ⼆叉搜索…

java----LinkedHashMap

.由键决定:有序、不重复、无索引 .这里的有序指的是保证存储和去除的元素顺序一致 原理:底层数据结构依然是哈希表,只是每个键值对元素又额外多了一个双链表的机制记录存储的顺序。 内容来自:集合进阶-09-LinkedHashMap_哔哩哔哩_bilibili

ChatGPT 在国内使用的方法

AI如今很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;ChatGPT 真是无所不能~ 作为一款出色的大语言模型&#xff0c;ChatGPT 实现了人类般的对话交流&#xff0c;最主要是能根据上下文进行互动。 接下来&#xff0c;我将介绍 ChatGPT 在国…

hackmyvm靶场--zon

环境 攻击机kali 靶机 未知 主机探测 因为在同一个局域网内使用ARP协议探测存活主机 靶机为192.168.56.128 端口探测 常见的80和22端口 那么一定是寻找web漏洞拿shell了 后台扫描 后台扫描常用dirsearch和gobuster,有时候小字典可能不太行&#xff0c;可以尝试换个大点…

JAVA——数据流、序列化流

目录 一、DataOutputStream(数据输出流&#xff09; 二、DataInputStream(数据输入流&#xff09; 三、序列化流 1.1 ObjectOutputStream(对象字节输出流&#xff09; 1.2 OutputStream(对象字节输入流&#xff09; 四、补充 一、DataOutputStream(数据输出流&#xff09; …

Flutter 获取手机连接的Wifi信息

测试版本 Flutter&#xff1a;3.7.6Dart:2.19.3 network_info_plus: 4.0.1 前言 我在做设备配网的时候&#xff0c;需要选择配网的WiFi。用下拉选择框展示WiFi列表。现在有个需求&#xff1a;默认展示的设备为手机连接的wifi。要实现这个需求只要能够获取到手机连接的wifi信息…

直接插入排序(C语言实现)

目录 1.直接插入排序介绍 2.实现思路 3.动图展示 4.代码实现 &#xff08;升序&#xff09; 单趟排序实现 单趟排序代码 直接插入排序函数 5.代码测试 6.时空复杂度分析 时间复杂度O(N^2) 空间复杂度O(1) 1.直接插入排序介绍 插入排序&#xff0c;又叫直接插入排序。…

(十七)MATLAB读取Gazebo话题信息

在仿真实验过程中&#xff0c;我们有时需要实时读取ROS及Gazebo话题&#xff0c;目前互联网上关于读取ROS的话题资料较多&#xff0c;读取Gazebo话题的参考资料较少&#xff0c;本文将以Ubuntu下固定翼仿真为例&#xff0c;展示如果通过MATLAB的插件GazeboPlugin读取Gazebo话题…

MoFA: 迈向AIOS

再一次向朋友们致以中秋的祝福&#xff01; MoFA (Modular Framework for Agents)是一个独特的模块化AI智能体框架。MoFA以组合&#xff08;Composition)的逻辑和编程&#xff08;Programmable&#xff09;的方法构建AI智能体。开发者通过模版的继承、编程、定制智能体&#xf…