迭代器模式及STL中迭代器概念

迭代器设计模式 

迭代器模式的基本概念是:提供对聚合类对象的统一访问,而无需关心对象内部的数据组织方式。

UML描述

图片来自:(http://www.cnblogs.com/jqbird/archive/2011/08/31/2160653.html)

抽象迭代器接口定义了统一的访问方式:First(第一个对象), Next(下一个对象),IsDone(是否访问完毕),具体迭代器类定义中包含聚合类对象的引用或者指针,在实现接口中定义的方法时,通过对象的引用或者指针去遍历集合的对象。

这个可以结合STL的迭代器概念来说明,对于每一种容易,其遍历方式是不一样的,所以每一个容器都有其专属的访问方式,在每一个专属迭代器的定义中,有针对具体类似于next方法(比如对+,++操作符的操作起到的效果与此类似)的实现。

迭代器定义:

01 // TEMPLATE CLASS iterator
02 template<class _Category,
03      class _Ty,
04      class _Diff = ptrdiff_t,
05      class _Pointer = _Ty *,
06      class _Reference = _Ty&>
07      
08 struct iterator
09 {   // base type for all iterator classes
10     typedef _Category iterator_category;
11     typedef _Ty value_type;
12     typedef _Diff difference_type;
13     typedef _Diff distance_type;    // retained
14     typedef _Pointer pointer;
15     typedef _Reference reference;
16 };

在通用迭代器的定义中,有如下几种数据类型必须要说明(用于描述迭代器本身的类型信息): 
value type:指迭代器所指对象的类型 
difference_type 表示迭代器之间的距离类型 
pointer: 所指对象的指针类型 
reference:所指对象的引用类型 
category: 迭代器类型:如: 
只读(Iput Iterator):不允许修改指向的对象 
只写(Output Iterator):只允许写 
可读可写(Forward Iterator):允许读写 
可双向移动迭代器(Bidirectional Iterator):支持迭代器的双向移动,可前进可后退。 
随机访问迭代器(Random Access Iterator):支持迭代器的随机访问

 

结合vector迭代器的定义,我们分析一下具体的代码:

01 template<class _Myvec>
02 class _Vector_iterator
03 public _Vector_const_iterator<_Myvec>
04 {   // iterator for mutable vector
05 public:
06     typedef _Vector_iterator<_Myvec> _Myiter;        //当前具体的迭代器类型
07     typedef _Vector_const_iterator<_Myvec> _Mybase; 
08  
09         //迭代器的相关属性描述:特性萃取剂通过该信息获取迭代器的相关信息
10     typedef random_access_iterator_tag iterator_category;
11     typedef typename _Myvec::value_type value_type;
12     typedef typename _Myvec::difference_type difference_type;
13     typedef typename _Myvec::pointer pointer;
14     typedef typename _Myvec::reference reference;
15  
16         //构造函数
17     _Vector_iterator()
18         {   // construct with null vector pointer
19         }
20  
21     _Vector_iterator(pointer _Parg, const _Container_base *_Pvector)
22         : _Mybase(_Parg, _Pvector)
23         {   // construct with pointer _Parg
24         }
25  
26      
27         //典型操作符重载,以支持迭代器对数据的访问、迭代器的移动
28     reference operator*() const
29         {   // return designated object
30         return ((reference)**(_Mybase *)this);
31         }
32  
33     pointer operator->() const
34         {   // return pointer to class object
35         return (&**this);
36         }
37  
38     _Myiter& operator++()
39         {   // preincrement
40         ++*(_Mybase *)this;
41         return (*this);
42         }
43  
44     _Myiter& operator--()
45         {   // predecrement
46         --*(_Mybase *)this;
47         return (*this);
48         }
49  
50     _Myiter& operator+=(difference_type _Off)
51         {   // increment by integer
52         *(_Mybase *)this += _Off;
53         return (*this);
54         }
55  
56     _Myiter operator+(difference_type _Off) const
57         {   // return this + integer
58         _Myiter _Tmp = *this;
59         return (_Tmp += _Off);
60         }
61  
62     _Myiter operator-(difference_type _Off) const
63         {   // return this - integer
64         _Myiter _Tmp = *this;
65         return (_Tmp -= _Off);
66         }
67  
68         //下表操作:进行迭代器偏移后解引用
69     reference operator[](difference_type _Off) const
70         {   // subscript
71         return (*(*this + _Off));
72         }
73  
74         ......
75     };

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值