当前位置: 首页 > 工具软件 > SGI STL > 使用案例 >

sgi stl源码学习之deque

哈涵容
2023-12-01

_Deque_iterator成员函数operator+=

 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, 估计是这么考虑的吧,同理一般情况也同样理解

如有不对的地方,请指教
不积跬步,无以至千里.不积小流,无以成江海

每天进步一点点

 类似资料: