C++ STL : 模拟实现STL中的容器适配器stack和queue
目录
- 什么是容器适配器
- stack
- stack的文档介绍-(来自cplusplus)
- stack的实现
- queue
- queue的文档介绍-(来自cplusplus)
- queue的实现
什么是容器适配器
之前模拟实现的vector,string,list等都是容器,而这次要实现的stack和queue则是容器适配器,那么什么是容器适配器呢?
适配器其实就是一个转换装置,这种东西在生活中非常常见。例如将USB接口转为Type-c接口,就可以在手机上用U盘,又或者三脚插头转二脚插头,方便使用更多的插座。适配器的作用就是在不更换设备的情况下,能让我们的设备适用于其他情景,或者拥有别的功能。
在STL中,stack和queue其实就是传统数据结构中的栈和队列,我们并不关心他的底层是什么,因为我们只需要保证他具有后进先出和先进先出的特点即可,这个特点,无论是使用vector,还是list都可以实现,既然这样,那就干脆将其作为一个适配器,不需要再创建新的容器,而是直接在原有的容器上实现他的特性即可,并且这个容器可以有多种选择。
stack
stack的文档介绍-(来自cplusplus)
- stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。
- stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
- stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作: empty:判空操作 back:获取尾部元素操作 push_back:尾部插入元素操作 pop_back:尾部删除元素操作
- 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque。
stack的实现
stack的实现其实就是栈的实现,只需要在复用原有代码的基础上增加stl的特性即可,
下面是之前数据结构篇章时实现的栈
栈的实现
库中默认选择的容器是deque
#include<deque>namespace lee
{/*STL底层中的容器选择的是deque,因为deque是假想的连续空间,他每次插入时扩容都会直接在插入的地方直接插入一片固定大小的空间,这样就保证了逻辑上的线性,不需要拷贝数据。而vector每次扩容,都需要创建新空间,拷贝原数据,销毁原空间,并且开的空间是原数据的1.5倍或2倍(不同版本)vector不仅效率不比deque高,空间的利用率也不高,多次扩容会导致空间的碎片化*/template<class T, class Container = std::deque<T>>class stack{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}T& top() {return _con.back();}const T& top() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}
queue
queue的文档介绍-(来自cplusplus)
- 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。
- 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。元素从队尾入队列,从队头出队列。
- 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操 作: empty:检测队列是否为空 size:返回队列中有效元素的个数 front:返回队头元素的引用 back:返回队尾元素的引用 push_back:在队列尾部入队列
pop_front:在队列头部出队列- 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标 准容器deque。
queue的实现
队列的实现
库中默认选择的容器是deque
#include<deque>namespace lee
{/*STL中queue底层的容器是deque,因为deque和list一样插入删除的效率都是O(1),并且deque的效率更高,因为list是一次创建一个结点后插入,并且这些空间是离散分布的.deque是每次创建一个固定大小的空间,并在这块空间上面进行插入删除,这样的效率更高,并且因为申请的空间都是一段一段的连续空间,内存的利用率更高*/template<class T, class Container = std::deque<T>>class queue{public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_front();}T& front(){return _con.front();}const T& front() const{return _con.front();}T& back(){return _con.back();}const T& back() const{return _con.back();}size_t size() const{return _con.size();}bool empty() const{return _con.empty();}private:Container _con;};
}
C++ STL : 模拟实现STL中的容器适配器stack和queue相关推荐
- C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
除了vector,list,deque等常用的容器,还有根据这些常用的容器进行改造来满足特殊要求的容器,这些特殊容器的行为和常用容器很相近,也称为容器适配器. 常用的容器适配器有三个,分别是stack ...
- C++ 容器适配器(stack、queue、priority_queue)
容器适配器 首先,我们要明白适配器是干什么的?其实就是一个接口转换装置,是得我们能用特定的方法去操作一些我们本来无法操作的东西.举一个例子,比如你的一个设备支持串口线,而你的电脑支持的是usb口,这时 ...
- C++ STL : 模拟实现STL中的关联式容器unordered_map/unordered_set
目录 unordered_map/unordered_set unordered_map/unordered_set与map/set的区别 底层哈希桶的改造 仿函数 Key值的获取方法 hash(ke ...
- C++中的deque、stack、queue及priority_queue
C++中的deque.stack.queue及priority_queue 文章目录 C++中的deque.stack.queue及priority_queue 一.deque 二.stack 三.q ...
- C++ STL : 模拟实现STL中的容器适配器priority_queue
目录 priority_queue 文档介绍 实现思路 思路 仿函数 实现 priority_queue 文档介绍 文档介绍 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含 ...
- C++ STL : 模拟实现STL中的关联式容器map和set
目录 关联式容器 键值对 底层红黑树的改造 仿函数 红黑树的迭代器 完整代码 set set的文档介绍 set的实现 map map的文档介绍 map的实现 operator[] 完整代码 multi ...
- C++ STL : 模拟实现STL中的list类
文章目录 list list的介绍 list的优缺点 list的迭代器失效问题 实现的接口 节点部分 迭代器部分 list部分 代码实现 list list的介绍 list的文档介绍 list是可以在 ...
- C++ STL : 模拟实现STL中的vector类
文章目录 vector vector的介绍 vector的优缺点 实现时需要注意的细节问题 1. Capacity增长问题 2. memset等函数来带的按字节拷贝问题 3. 深浅拷贝问题 4. 迭代 ...
- C++ STL : 模拟实现STL中的string类
string的文档介绍 string是表示字符序列的类 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性. string类是使用c ...
最新文章
- 为什么说机器学习是预防欺诈的最佳工具?
- Hybrid assembly with long and short reads improves discovery of gene family expansions
- java题目不会做那么解答_有几道JAVA的题目不会做 哪位高手来解答一下!谢
- 有关概率图模型中的D-Seperation的理解,附cousera例题解读
- 一个小小指针,竟把Linux内核攻陷了!
- 以 DirectUI 方式实现的ImageButton
- 解决linux下终端无法输入的假死问题
- 设计模式学习笔记(5) - 策略模式
- 计算机信息系统发生安全事故,网络安全事故报告制度
- 汇编语言简明教程习题答案
- 小程序纵向选项卡可以滑动_微信小程序实现选项卡滑动切换
- Qt设置字体类型及添加字体文件
- 计算非等间隔离散曲线的曲率
- 360漏洞修复卡在正在安装的解决方法
- 计算机设备和打印机打不开,Windows7设备和打印机窗口打不开如何解决
- 【我的渲染技术进阶之旅】关于C++轻量级界面开发框架Dear ImGui介绍
- openwrt 无线桥接(AP)
- 【调剂】欢迎调剂模式识别、计算机视觉、虚拟现实方向研究生-上海应用技术大学...
- 南非世界杯对阵及电视直播表
- VUE3/TS/TSX入门手册指北
热门文章
- redis命令-key操作
- 计算机网络按信号频带占用方式,[大学计算机应用基础第六章计算机网络基础.ppt...
- python中的set和dict_Python中dict和set的用法讲解
- dockerfile mysql例子_简单的Dockerfile书写(实例!!!)
- pd.get_dummies()
- JavaScript正则表达式语法与示例
- 【客户案例】智能驾驶行业如何上云?
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.5. 组合多个索引
- cxgrid实现分组统计和添加Footer
- 剑指Offer(java版):第一个只出现一次的字符