[STL]源码解析:deque

使用Deque时包含头文件<deque.h>,而此头文件只是“简单”的包含了<_deque>。

一、双向队列基本迭代器(_Deque_iterator_base)

1. _Deque_iterator_base是有一个模板的模板类:

template <class _Tp>
struct _Deque_iterator_base {
}
2. 定义别名

  typedef random_access_iterator_tag iterator_category;
  typedef _Tp value_type;
  typedef size_t size_type;
  typedef ptrdiff_t difference_type;
  typedef value_type** _Map_pointer;
  typedef _Deque_iterator_base< _Tp > _Self;

ptrdiff_t是c/c++标准,通常用来保存两个指针相关的结果,通常为long int。

3. 成员函数:得到缓存大小 

  static size_t _S_buffer_size() {
    const size_t blocksize = _MAX_BYTES;
    return (sizeof(_Tp) < blocksize ? (blocksize / sizeof(_Tp)) : 1);
  }
声明为了静态的,此函数的目的是?

如果_MAX_BYTES为256,type为int。于是返回的是64,可这个值有什么意义呢?

4. 成员变量

  value_type* _M_cur;
  value_type* _M_first;
  value_type* _M_last;
  _Map_pointer _M_node;
5. 构造函数

  _Deque_iterator_base(value_type* __x, _Map_pointer __y)
    : _M_cur(__x), _M_first(*__y),
      _M_last(*__y + _S_buffer_size()), _M_node(__y) {}
_Deque_iterator_base() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
默认构造函数。

6. 一个暂没看懂什么意思的函数

  difference_type _M_subtract(const _Self& __x) const {
    return difference_type(_S_buffer_size()) * (_M_node - __x._M_node - 1) +
      (_M_cur - _M_first) + (__x._M_last - __x._M_cur);
  }
7. 增加1

  void _M_increment() {
    if (++_M_cur == _M_last) {
      _M_set_node(_M_node + 1);
      _M_cur = _M_first;
    }
  }
8. 减少1

  void _M_decrement() {
    if (_M_cur == _M_first) {
      _M_set_node(_M_node - 1);
      _M_cur = _M_last;
    }
    --_M_cur;	// 由于last是最后一个元素再往后一个,因而要再--
  }
9.

  void _M_set_node(_Map_pointer __new_node) {
    _M_last = (_M_first = *(_M_node = __new_node)) + difference_type(_S_buffer_size());
  }
};
从代码中可以看到,此函数先根据__new_node设置了一个新的_M_first,然后又根据此新的_M_first,设置了_M_last。

10. 

  void _M_advance(difference_type __n) {
    const size_t buffersize = _S_buffer_size();
    difference_type __offset = __n + (_M_cur - _M_first);
    if (__offset >= 0 && __offset < difference_type(buffersize))
      _M_cur += __n;
    else {
      difference_type __node_offset =
        __offset > 0 ? __offset / buffersize
                   : -difference_type((-__offset - 1) / buffersize) - 1;
      _M_set_node(_M_node + __node_offset);
      _M_cur = _M_first +

        (__offset - __node_offset * difference_type(buffersize));
    }
  }

二、_Deque_iterator迭代器


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值