任何种类的iterator都至少提供以下功能:
- 1、可取值:*it。x=*it有效,但*it=x无效。
- 2、可向前移动:++it,it++ (在区间(being, end]内,对于原生指针,begin~end之间不能出现NULL)
- 3、相等比较:it1==it2, it1!=it2。
- 4、可复制:it1=it2
- 一、Input Iterator:
- 最基本的,同上。相当于:只能读取但无法改变it所指的对象的内容。
- 二、Output Iterator:
- 比Input Iteraotr增加了一个:*it=x,可以读取改变it所指对象的内容。
- 三、Forward Iterator:
- 只向前移动的。定义了++it、it++,没有定义it--、--it。包含了 Output Iterator所有功能。例如:list::iterator。
- 四、Bidirectional Iterator:
- 双向移动,定义了 it--、--it。
- 五、Radom Access Iterator:
- 随机访问,定义了 it+n,it-n, it[n],例如:vector::iterator。
越往下,功能越多
一般情况下,算法函数会对不同种类的Iterator进行重载设计(注意不是特化)以优化性能,以advance( it, n)为例子:
提供给外界的函数:
- template<class InputIteratr, class Distance>
- advance(InputIterator it, Distance n)
- {
- __advance(it, n, iterator_traits<InputIterator>::iterator_category());
- }
内部重载函数设计:
算法函数以功能最弱的游标类型作为参数类型。
上例中的各种 xxx_iterator_tag 类是继承关系。因此不必为每个 xxx_iterator_tag 写一个重载函数,只需写出不同的。编译器会自动匹配到最合适的。
利用函数得到Iterator的特性对象,用在重载函数中。