五种iterator的类别

任何种类的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的特性对象,用在重载函数中。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值