STL(四) 迭代器

STL(四) 迭代器

  • 迭代器是泛型指针
    • 普通指针可以指向内在中的一个地址
    • 迭代器可以指向容器中的一个位置
      • 通过重载运算符来支持指针操作
      • * ++ -- 等
  • STL的每一个容器类型中,都定义了一组对应的迭代器。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。
  • 迭代器的类型
    • 输入迭代器
      • 可以用来从序列中读取数据
        • 支持*号操作:*p; ++p;
        • 这里*p是不能出现在表达式的左边的,不能被赋值。
    • 输出迭代器
      • 允许向序列中写入数据
        • 可以赋值给*p: *p = 0;也具有++操作。
        • *p可以出现在表达式的左边,可以被赋值。
    • 前向迭代器
      • 既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历
      • 不支持--操作,逆向减减,不支持
    • 双向迭代器
      • 与前向迭代器相似,但是在两个方向上都可以对数据遍历
      • 在前身的基础上,支持减减操作。
    • 随机访问迭代器
      • 也是双向迭代器,但能够在序列中的任意两个位置进行跳转
      • 在双向的基础上,可以支持+5; -3; += ; -=;等操作

迭代器的类型表

迭代器操作和分类

 

种类:

 

Output

 

input

 

forward

 

bidirectional

 

random-access

 

缩写:

 

Out

 

In

 

For

 

Bi

 

Ran

 

Read:

 

 

=*p

 

=*p

 

=*p

 

=*p

 

Access:

 

 

->

 

->

 

->

 

->  []

 

Write:

 

*p=

 

 

*p=

 

*p=

 

*p=

 

Iteration:

 

++

 

++

 

++

 

++
--

 

++
-- + - += -=

 

Comparison:

 

 

==
!=

 

==
!=

 

==
!=

 

==
!= < > >= <=

    • 跟踪迭代器构造:
      0​ main中断点:std::vector<int>::iterator it;因有自定义typedef _Vector_iterator<_Vector_val<_Val_types> > iterator;
      ​1​ 来到空构造 _Vector_iterator()处:
      _Vector_iterator()
      { // construct with null vector pointer
      }​​
      

        

      ​3 发现继承 
      class _Vector_iterator
      : public _Vector_const_iterator<_Myvec>
      

        

      4 来到基类
      _Vector_const_iterator()
      : _Ptr()
      { // construct with null pointer
      }​
      

        

      5 向上发现
      template<class _Myvec>
      class _Vector_const_iterator
      : public _Iterator012<random_access_iterator_tag,
      typename _Myvec::value_type,
      typename _Myvec::difference_type,
      typename _Myvec::const_pointer,
      typename _Myvec::const_reference,
      _Iterator_base>
      

        

      6 再向上发现
      template<class _Category, class _Ty, class _Diff, class _Pointer, class _Reference,
      class _Base>
      struct _Iterator012
      : public _Base
      { // base type for debugging iterator classes
      typedef _Category iterator_category;
      typedef _Ty value_type;
      typedef _Diff difference_type;
      
      typedef _Pointer pointer;
      typedef _Reference reference;
      };
      

        至此_Base已经跟不下去了。回头​​​——

      7 初始_Ptr: 看_Ptr是什么类型-- 转定义:_Tptr _Ptr;原来是_Tptr类型,—— 又 发现typedef typename _Myvec::pointer _Tptr;最后的自定义:typedef typename _Myvec::const_pointer pointer;​原来_Ptr是我们传递进来的。在当前就是int *。
      8 初始_Ptr()后返回
      _Vector_iterator()
      { // construct with null vector pointer
      }​
      

      ​9​ 返回到main调用处std::vector<int>::iterator it;

      10 vector<int>类型的迭代器的构造就此完成了; 相当于把int*的指针做了一个包装。


    • 跟踪迭代器中begin()
      iterator begin() _NOEXCEPT
      { // return iterator for beginning of mutable sequence
      return (iterator(this->_Myfirst(), &this->_Get_data()));
      }
      

        返回一个iterator对象,调用的是iterator(this->_Myfirst(), &this->_Get_data());有2个参数的iterator();

      ​​1 发现自定义typedef _Vector_iterator<_Ty, _Alloc> iterator; 调用2个参数的是_Vector_iterator<_Ty, _Alloc>
      _Vector_iterator(pointer _Ptr, const _Container_base *_Pvector)
      : _Mybase(_Ptr, _Pvector)
      { // construct with pointer _Ptr
      }
      

        

      ​​3 发现基类
      template<class _Ty, class _Alloc>
      class _Vector_iterator : public _Vector_const_iterator<_Ty, _Alloc>
      { // iterator for mutable vector......}
      

        

      _Vector_const_iterator(_Tptr _Ptr, const _Container_base *_Pvector)
      { // construct with pointer _Ptr
      _SCL_SECURE_VALIDATE(_Pvector == NULL || (((_Myvec *)_Pvector)->_Myfirst <= _Ptr && _Ptr <= ((_Myvec *)_Pvector)->_Mylast));
      this->_Adopt(_Pvector);
      _Myptr = _Ptr;
      }​
      

        

      5 ​this->_Adopt(_Pvector); 采纳这根指针 , _Pvector这根指针是指向的是向量对象。


      ​​​(*****未完待续******)

posted on 2017-03-31 17:28  zzdoit  阅读(366)  评论(0编辑  收藏  举报

导航