roxell

导航

iterator_traits

iterator的最重要的特点是有和其相关的类型定义。包括value type和distance type。value type用来描述iterator指向的对象的类型;distance type用来描述两个iterator之间的距离。

指针是一种iterator,就int*来说,int是value type,distance type是ptrdiff_t.

泛型算法需要访问这些和iterator相关的类型,比如说在创建临时变量的时候就需要知道value type。iterator_traits类就是干这个的。

最显而易见的解决方法是所有的iterator都包含一个嵌入的类型,比如说value type例如I::value_type,但是这种办法行不通。指针也是iterator但是指针不可以是类。比如说I是int*的话,就不可能把I::value_type定义成int。

iterator_traits就是个模板类,用来放内嵌的typedef的。

iterator_traits有两种定义,一种是纯泛型的,一种是专门的,对应指针类型。
  template <class Iterator>
  struct iterator_traits {
    typedef typename Iterator::iterator_category iterator_category;
    typedef typename Iterator::value_type        value_type;
    typedef typename Iterator::difference_type   difference_type;
    typedef typename Iterator::pointer           pointer;
    typedef typename Iterator::reference         reference;
  };

  template <class T>
  struct iterator_traits<T*> {
    typedef random_access_iterator_tag iterator_category;
    typedef T                          value_type;
    typedef ptrdiff_t                  difference_type;
    typedef T*                         pointer;
    typedef T&                         reference;
  };

当创建一个新的iterator类型的时候,注意这里说的是iterator类型,而不是iterator指向的数据的类型,需要确认iterator_traits<T>被正确的定义。有两种方法。

posted on 2004-10-22 17:19  命中注定宝剑会发出嘟嘟嘟的讯号  阅读(279)  评论(0)    收藏  举报