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) 收藏 举报
浙公网安备 33010602011771号