STL系列4-deque分析

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重载各种运算符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值