| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C++ STL中的容器适配器 stack、queue、priority_queue -> 正文阅读 |
|
[C++知识库]C++ STL中的容器适配器 stack、queue、priority_queue |
文章目录一、适配器(adaptor)在了解容器适配器之前,我们首先应该知道什么是适配器。 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 举个具体的例子,在日常生活中,如果想要给我们的手机充电,直接使用 220V 的交流电是不合适的,因为 220V 的电压对手机来说太高了,于是我们会使用电源适配器(充电头),它将 220V 的交流电转换为适合手机的电压来给手机充电。 那么,这就方便我们理解什么是容器适配器了。 二、容器适配器(container adaptor)在很多情况下,已有的容器(比如 vector、list、deque 等)虽然都能满足要求,但是它们的接口不完全适合或不应该全都暴露出来。于是我们就会想,能不能也搞一个适配器,对已有的满足要求的容器进行适当的封装,只暴露适合的接口,这样就方便了,这就是容器适配器。 C++的STL提供了三种容器适配器,分别是栈、队列、优先队列(stack、queue 和 priority_queue)。 stack 可以由 vector、list、deque 封装而成。
下面将分别对这三种容器适配器进行说明。 自己在进行模拟实现时,为了防止跟库里的命名冲突,需要放到自己定义的命名空间里。 1、栈(stack)stack 的特点:只能从容器的一端进行元素的插入和提取操作,LIFO(后进先出)。 为了支持 stack 的基本操作,stack 的底层容器可以是任何的标准容器类模板或者一些其他的专门设计的容器类,这些容器应该支持以下操作: 1)empty:判空
标准容器 vector、list、deque 都能实现以上操作。 模拟实现:
2、队列(queue)queue 的特点:只能从容器的一端插入元素,从另一端提取元素,FIFO(先进先出)。 为了支持 queue 的基本操作,queue 的底层容器可以是标准容器类模板之一或者一些其他的专门设计的容器类,这些容器应该支持以下操作: 1)empty:判空
标准容器 list、deque 都能实现以上操作。 模拟实现:
- - - - - - - - - - - - - - -(关于仿函数)仿函数(也叫函数对象)其实并不是函数,它是一个类,在行为上很像函数。 举个既简单又易于理解的例子:
仿函数没有任何成员变量,只有重载了运算符 () 的成员函数。 于是,一个类对象的成员函数的调用,看起来特别像真正的函数调用。
3、优先队列(priority_queue)priority_queue 的特点:元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除,Largest Out(最高级先出)。
priority_queue 通常采用堆数据结构来实现。
默认情况下 priority_queue 是最大堆。 为了支持 priority_queue 的基本操作,priority_queue 的底层容器可以是任何的标准容器类模板或者一些其他的专门设计的容器类,这些容器应该可以通过随机访问迭代器访问,并支持以下操作: 1)empty:判空
标准容器 vector、deque 都能实现以上操作。
使用例子:
模拟实现: 其实,基本上就是在写堆(数据结构)的接口。
有了仿函数的基本概念,这就好理解 priority_queue 中的两个仿函数 less 和 greater 了。
加上了仿函数之后,就能更好地控制 priority_queue 是最大堆还是最小堆了。
仿函数的具体逻辑可以按照自己的需求来实现,然后在定义一个优先队列对象时传参即可。 简介:双端队列(deque)deque 即 double ended queue,译为双端队列,是一个标准容器类模板。
它是一种双开口的具有“连续”空间且支持随机访问的数据结构。
1、设计初衷先将 vector 和 list 对比一下: vector list
基于上述事实,deque 融合了 vector 和 list 的优点: 2、优势将 deque 分别与 vector 和 list 做对比: 1)与 vector 相比,deque 的优势是:头插和头删时,不需要挪动元素,效率特别高;而且在扩容时,也不需要拷贝大量的元素,其效率是比 vector 高的。 2)与 list 相比,deque 的优势是:底层是(分段的)连续空间,空间利用率比较高,不需要存储额外字段。 deque 虽然具有上述优势,但是在实际中用得很少,并不是主流的数据结构。 至于为什么,了解它的底层结构和缺陷就知道了。 3、底层结构deque 的底层并不是真正的一段连续的空间,而是由分段的连续空间组合而成的。 实际上,deque 类似于一个动态的二维数组。 为了维护其“整体连续”以及随机访问的假象,其迭代器的设计是比较复杂的。 deque 虽然支持随机访问,但是随机访问速度较慢,不适合频繁随机访问。
4、缺陷deque 有一个很大的缺陷:不适合遍历。因为在遍历时,deque 的迭代器需要频繁地去检测其是否移动到 还有一个缺陷:中间的插入和删除操作效率低。 因此在实际应用中,当需要线性结构时,大多数情况下会优先考虑 vector 和 list 。 5、STL 选择 deque 作为 stack 和 queue 的底层默认容器的原因经过上述讲解之后,这个问题也就不难回答了: (1)deque 作为 stack 的底层容器: deque 作为 queue 的底层容器: (2)stack 和 queue 都不需要遍历(因此它们都没有迭代器),只需要在固定的一端或者两端进行操作。 (3)再结合 deque 自身的优缺点:适合一端或者两端频繁的插入和删除,不适合中间的插入和删除,也不适合遍历。 综上所述,deque 作为 stack 和 queue 的底层容器,正好充分发挥了它的优势,且完美避开了它的缺陷,可以说是完胜 vector 和 list 的。 因此,STL 选择 deque 作为 stack 和 queue 的底层默认容器。 6、总结从某种角度上看,deque 是 vector 和 list 相互折衷后所产生的容器,它虽然拥有两者的优点,但是由于某些缺陷,实用性并不大,就显得“华而不实”了。 虽然如此,但 deque 仍有用武之地,比如作为 stack 和 queue 的底层默认容器。 更多文章: |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 0:34:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |