typedef _Deque_iterator _Self;
typedef ptrdiff_t difference_type;
Tp**_M_node
原码里面的东东
_Self& operator+=(difference_type __n)
{
difference_type __offset = __n + (_M_cur - _M_first);
if (__offset >= 0 && __offset < difference_type(_S_buffer_size()))
_M_cur += __n;
else {
difference_type __node_offset =
__offset > 0 ? __offset / difference_type(_S_buffer_size())
: -difference_type((-__offset - 1) / _S_buffer_size()) - 1;
_M_set_node(_M_node + __node_offset);
_M_cur = _M_first +
(__offset - __node_offset * difference_type(_S_buffer_size()));
}
return *this;
}
该函数表示迭代器直接移动 n 个距离, _M_cur表示迭代器指向缓冲区的当前元素(下一个将要操作的位置 ), _M_first迭代器指向缓冲区的头部, _S_buffer_size()表示一个缓冲区可存储的元素的个数, __offset表示迭代器基于_M_cur向前向后(+或-)移动n个距离
if (__offset >= 0 && __offset < difference_type(_S_buffer_size()))
如果offset大于等于0,并且移动后还在该缓冲区的范围内, 直接_M_cur += __n
关键在它的else的处理逻辑, 不在同一缓冲区就进入else, 如果是向前移出缓冲区(__offset >= difference_type(_S_buffer_size())),
如果向后移出了缓冲区(__offset < 0), 假如取个特殊情况_M_cur - _M_first等于0, 那就相当于从当前缓冲区的_M_first向后移动并, -difference_type((-__offset - 1) / _S_buffer_size()) - 1 , 为什么后面要减1, 假设移动的距离刚好一个缓冲区大小(__n < 0), -difference_type((-__offset - 1) / _S_buffer_size())的结果是为0, 减1正确移动到相应_M_node上, 前面的减1,假如没有前面的减1,-difference_type((_S_buffer_size() ) / _S_buffer_size()) - 1等于-2, 但正确的情况应该是-1, 估计是这么考虑的吧,同理一般情况也同样理解
如有不对的地方,请指教
不积跬步,无以至千里.不积小流,无以成江海
每天进步一点点