STL容器分析--deque
deque,故名思义,双向队列。可以在头尾进行插入删除。
而STL中采用了链表+线性表的数据结构来实现deque,因而除了满足双向队列的特点以外,还支持随机访问。
下面,贴一段代码。
总览:双向队列是由链式线性表+顺序线性表组成。支持随机访问
首先看下定义:
template
class deque : protected _Deque_base<_Tp, _Alloc>
可知,需先分析_Deque_base
template
class _Deque_base {
...
_Deque_impl _M_impl;
};
其中,_Deque_impl类型的_M_impl是维持deque有序的关键数据结构,
struct _Deque_impl : public _Tp_alloc_type
{ _Tp** _M_map;
size_t _M_map_size;
iterator _M_start;
iterator _M_finish;
_Deque_impl() : _Tp_alloc_type(), _M_map(0), _M_map_size(0), _M_start(), _M_finish() { }
_Deque_impl(const _Tp_alloc_type& __a) : _Tp_alloc_type(__a), _M_map(0), _M_map_size(0), _M_start(), _M_finish() { } };
可知,在_M_impl中,保存了一个_Tp*的数组_M_map,每个数组的大小为_M_map_size. 并保存了实际数据起始和终止的迭代器。
假如说_M_map_size = 0x10
0x70002000: 0x70002010
__________________
_M_map |__________________|
0x70003000: 0x70003010 __________________ |__________________| _M_start可以指向任何位置 __________________ |__________________| __________________ |__________________| __________________ |__________________| _M_end也可以指向任何位置,只是需要在_M_map中存放于_M_start之后 __________________ |__________________|
至此,可以通过链表找到顺序线性表,接下来就是定位顺序线性表中元素的位置