迭代器设计模式
value type:指迭代器所指对象的类型
difference_type 表示迭代器之间的距离类型
pointer: 所指对象的指针类型
reference:所指对象的引用类型
category: 迭代器类型:如:
只读(Iput Iterator):不允许修改指向的对象
只写(Output Iterator):只允许写
可读可写(Forward Iterator):允许读写
可双向移动迭代器(Bidirectional Iterator):支持迭代器的双向移动,可前进可后退。
随机访问迭代器(Random Access Iterator):支持迭代器的随机访问
迭代器模式的基本概念是:提供对聚合类对象的统一访问,而无需关心对象内部的数据组织方式。
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 | }; |