使用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迭代器