文章目录
deque的设计
deque:分段连续
map:由一段vector构成,vector中每个元素为一个指向buffer的指针
deque的iterator设计:
-
四个元素:cur、first、last、node
cur:当前buffer中的位置
first:buffer的起始位置
last:buffer的最后位置
node:指向map中的控制指针位置
deque源码分析
struct _Deque_impl
: public _Tp_alloc_type
{
_Map_pointer _M_map; //该map的起始地址
size_t _M_map_size; //map的大小
iterator _M_start; //起始节点指针的迭代器
iterator _M_finish; //结束节点指针的迭代器
...
}
template<typename _Tp, typename _Ref, typename _Ptr>
struct _Deque_iterator
{
...
_Elt_pointer _M_cur;
_Elt_pointer _M_first;
_Elt_pointer _M_last;
_Map_pointer _M_node;
...
}
deque的初始化
template<typename _Tp, typename _Alloc>
void _Deque_base<_Tp, _Alloc>::_M_initialize_map(size_t __num_elements)
{
const size_t __num_nodes = (__num_elements/ __deque_buf_size(sizeof(_Tp))+ 1);
//计算当前的deque需要的节点数目
this->_M_impl._M_map_size = std::max((size_t) _S_initial_map_size,size_t(__num_nodes + 2));
//默认deque节点的最小数目为8
this->_M_impl._M_map = _M_allocate_map(this->_M_impl._M_map_size);
//deque的map前后需要空出相同的空间
_Map_pointer __nstart = (this->_M_impl._M_map + (this->_M_impl._M_map_size - __num_nodes) / 2);
_Map_pointer __nfinish = __nstart + __num_nodes;
...
this->_M_impl._M_start._M_set_node(__nstart);
this->_M_impl._M_finish._M_set_node(__nfinish - 1);
this->_M_impl._M_start._M_cur = _M_impl._M_start._M_first;
this->_M_impl._M_finish._M_cur = (this->_M_impl._M_finish._M_first
+ __num_elements
% __deque_buf_size(sizeof(_Tp)));
}
deque中buffer的大小
_GLIBCXX_CONSTEXPR inline size_t
__deque_buf_size(size_t __size)
{ return (__size < _GLIBCXX_DEQUE_BUF_SIZE
? size_t(_GLIBCXX_DEQUE_BUF_SIZE / __size) : size_t(1)); }
//如果元素的大小小于512则放入512/size个元素,否则只放一个
d e q u e < T > : : i n s e r t ( ) deque<T>::insert() deque<T>::insert()
deque<_Tp, _Alloc>::emplace(const_iterator __position, _Args&&... __args)
{
if (__position._M_cur == this->_M_impl._M_start._M_cur)
{
emplace_front(std::forward<_Args>(__args)...);
return this->_M_impl._M_start;
}
else if (__position._M_cur == this->_M_impl._M_finish._M_cur)
{
emplace_back(std::forward<_Args>(__args)...);
iterator __tmp = this->_M_impl._M_finish;
--__tmp;
return __tmp;
}
else
return _M_insert_aux(__position._M_const_cast(),
std::forward<_Args>(__args)...);
}
deque模拟连续空间
由deque_iterator实现,iterator重载各种运算符