deque是一种双向开口的连续线性空间。所谓双向开口,意思就是可以头尾两端分别做元素的插入和删除操作。当然,vector也可以在头尾两端进行插入删除操作(从技术上讲),但是其头部操作效率极差,无法被接受。
deque相比vector差异:
1、deque允许于常数时间内对头端进行元素的插入和删除操作。
2、deque没有所谓的容量(capacity)概念,因为它是动态的以分段连续空间组合而成的,随时可以增加一段新的空间并链接起来。
换句话说,deque是不会发生像vector的因旧空间不足而重新分配一块较大的空间,然后复制元素,释放原空间这种事情的。因此deque也没必要提供所谓的保留空间功能。
deque的迭代器:deque提供random access iterator,但并不是原生指标。其实现的复杂度也很大,这也影响到相关算法的效率。所以如非必要,应该尽量使用vector而不是deque。对deque进行排序时,可以先将元素复制到一个vector,排序后再复制回deque。
deque的存储结构:deque采用的是一种分段连续空间存储结构,采用一个map(不是stl中的map)来管理这些空间段。每个空间段的大小是固定的,当有新元素加入而空间不足时,就分配一个新的空间段。当空间段的个数增加时,可能需要分配一个更大的map。 deque的这种结构使得其迭代器上的操作可能需要跨越空间段,因而具有相当的复杂度。
新的map可以容纳更多的节点(也就是代表更多的缓冲区)
其begin()和end()所传回的两个迭代器如上图所示。
这两个迭代器事实上一直保持在deque内,名为start和finish。
deque::begin()传回迭代器start,deque::end()传回迭代器finish.这两个迭代器都是deque的data menbers。如图书中的这个deque拥有20个int的元素。,以3个缓冲区存储之。每个缓冲区存储8个int元素。map大小为8,目前用了3个节点并指向3个缓冲区。
deque的数据结构:
deque除了维护一个先前说过的指向map的指针外,也维护start,finish两个迭代器,分别指向第一缓冲区的第一个元素和最后缓冲区的最后一个元素(下一个位置)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class
deque{
public
:
typedef
T value_type ;
typedef
value_type* pointer ;
typedef
size_t
size_type ;
public
:
typedef
__deque_iterator<T,T&,T*,BufSiz> iterator ;
protected
:
//元素的指针的指针(pointer of pointer of T)
typedef
pointer* map_pointer ;
protected
:
iterator start ;
//表现第一节点
iterator finish ;
//表现最后一个节点
map_pointer map ;
//指向map,map是块连续空间,其每个元素都是个指针,指向一个节点(缓冲区)
size_type map_size ;
//map内有多少指针
...
} ;
|