再论Iterator

1.value type

  一般的,每个iterator都会有至少一个associatedtype,我们将iterator指向对象的类型称为value type。
   那么我们应该怎样取得iterator的value type呢?对于某个iterator,我们可以通过模板指定其valuetype,但是这是这个value type和iterator是分离的,对于对个不同算法,操作起来十分不便。
  那我们考虑是否可以在Iteratorclass 声明其value type呢?比如:

        template<class T>
        struct Iterator{
         typedefT value_type;
};

  那么可以将Iterator的value type写成 typenameIterator::value_type;
  但是这类Iterator是一个class,那么对于non-class类型的Iterator,比如int*,应该怎么怎么做呢?考虑到C++template的特化特性,我们可以写成如下形式:

template<classT>
struct iterator_traits<T*>{
         typedef  T value_type;
};

  对于const类型的可以写成:

template<classT>
struct  iterator_traits<const T*>{
         typedef T value_type;
};

  对于int*,我们就可以用iterator_traits<int*>::value_type;
  为了保持三种Iterator的一致性,对于class类型的Iterator,可以再向上封装一层。

struct  iterator_traits<Iterator>{
         typedef   typename Iterator::value_type value_type;
};

2.difference type

  对于Random AccessIterator来说,不可避免要表示两个Iterator之间的距离,比如对于指针型的Iterator,有p2-p1的运算,那么其结果是什么类型呢?
  我们知道,对于指针型的Iterator,指针相减的类型为ptrdiff_t,其为32位,最大表示值为2^31-1,那么对于一些Iterator,其值超出这个最大值怎么办?
  其实,我们可以采用value_type一样的机制,把differncetype定义为的Iterator class的嵌套类别,并加入iterator_traits中。
  一个使用differnce type的例子:

template<class Iterator, class T>
iterator_traits<Iterator>::difference_type
count(Iteratorfirst, Iterator last, const T& x){
         iterator_traits<Iterator>::difference_typen = 0;
         while(first!=last){
        if(*first == x)
          ++n;
          ++first;
      }
      return n;
}

3.reference type和point type

  如果p是一个mutableiterator,则*p类型为T&;如果p是一个const iterator,则*p类型为const T&,一般而言,*p的类型并不是p的value type,而是p的reference type;
Point type同理;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

One2zeror

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值