_Deque_base 用于维护一维的指针
//如果一维数组不够用了,需要动态开辟一个新的的一维数组,
//将原数组中的保存的缓冲区地址的指针全部复制到新的一维数组中
//
_Tp** _M_map; //一维数组
size_t _M_map_size; //一位数组的大小
iterator _M_start; // 一位数组的起始迭代器
iterator _M_finish; //一位数组的末尾迭代器
//每次进行分配的时候,只分配一个一维指针指向的数组的大小
_Tp* _M_allocate_node()
{
return _Node_alloc_type::allocate(__deque_buf_size(sizeof(_Tp))); }
一维数组的开辟于
//初始化一维的数组
template <class _Tp, class _Alloc>
void
_Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements)
{
size_t __num_nodes =
__num_elements / __deque_buf_size(sizeof(_Tp)) + 1;
//计算map大小
_M_map_size = max((size_t) _S_initial_map_size, __num_nodes + 2);
_M_map = _M_allocate_map(_M_map_size);
//获得一维数组的起始地址与终止地址
_Tp** __nstart = _M_map + (_M_map_size - __num_nodes) / 2;
_Tp** __nfinish = __nstart + __num_nodes;
__STL_TRY {
//开辟第二维的数组,一维数组的每一个元素中存放第二维数组的起始地址
_M_create_nodes(__nstart, __nfinish);
}
__STL_UNWIND((_M_deallocate_map(_M_map, _M_map_size),
_M_map = 0, _M_map_size = 0));
//设置一维数组的迭代器的指针
_M_start._M_set_node(__nstart);
_M_finish.