STL序列式容器 - deque

STL 序列式容器 - deque

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内有多少指针  
     ...  
} ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值