上篇文章中,给出了对于模拟实现中功能的补全,本篇文章将优先介绍一个新的容器
之后引入什么是适配器,以及适配器的使用方法,再通过适配器的思想来完成对于
,
、优先级队列
_
的实现。
目录
1. deque:
1.1 什么是deque:
在对的相关实现原理进行介绍前,首先来总结之前介绍的两种容器:
、
的优缺点:
对于,在前面对其进行模拟实现的文章中提到,可以将
看作之前数据结构中的顺序表,其特点是存储空间在物理以及逻辑上的连续性。因此,借由连续性可以得出,
的优点在于通过下标可以对空间中的内容进行随机访问。并且缓存命中较高对于其缺点,则是头部或者中间进行插入、删除元素时的效率过低,以及一次性开辟较多空间时带来的损耗
对于,同样提到,可以将其看作成带哨兵位头结点的双向循环链表,其特点是存储空间在逻辑上连续,但是在物理上不连续。因此,其优点在于任意位置的插入、删除数据时的效率,以及按需申请空间,不会造成浪费。但是由于其在物理上并不连续,因此不能使用下标来对
中的内容进行访问且缓存命中较低
不难看出,两者的优点几乎可以看作对于对于二者缺点的补充。而本部分介绍的容器,则可以看作是对于二者优点的一种结合。
1.2 deque的大致原理以及其特点:
对于,其内存管理方式采用了中控的方法,具体原理如下:

其中,中控所代表的空间是一个指针数组,里面保存了若干个指针,每个指针指向了一块空间,
对于开辟空间的大小,有相同、不同两种方式,这里采用相同进行解释,即每块空间均可以存储
个整型数据。对于上述容器,如果需要进行头插,则首先再开辟一块新的空间,这里命名为
,然后在
中插入数据即可,具体结构如下:

不过需要注意,进行头插时,插入数据的顺序并不是从前向后插入数据,而是从后向前依次插入数据,例如先后向
插入数据
。插入效果如下:

在对上述结构进行尾插时,只需要通过指针数组,找到最后一个,进行插入数据即可。即:

在对于进行删除数据时,例如进行头插,假设删除一个数据,效果如下:

如果再删除一个数据,此时中为空,在删除数据后销毁
,效果如下:

不难发现,对于,虽然其存储空间在物理上仍然保持一定的连续性,但是其头删却不会向
一样,需要进行挪动覆盖来完成。
对于的尾删,只需要找到最后一个数据所处的位置进行删除即可。
通过上述例子不难发现,对于,其头插、头删、尾插、尾删,均有着不错的效率。并且其存储空间的结构则结合了连续空间以及不连续空间。可以说是综合了
的优点,并且对二者的缺点进行了一定程度的互补。
不过,却并不能彻底代替
和
。对于
,其一大优点是可以通过下标来随意访问空间中的内容,对于
。,虽然也可以实现下标访问,但是其实现方法以及原理相对于
过于复杂。下面将

824

被折叠的 条评论
为什么被折叠?



