类别: 迭代器 | 组件类型: 类型 |
(例如,指针是迭代器;int*的值类型是int。它的距离类型是ptrdiff_t,因为如果p1和p2是指针,则表达式p1 - p2的类型为ptrdiff_t.)
泛型算法通常需要访问这些关联类型;例如,一个接受迭代器范围的算法可能需要声明一个类型为迭代器值类型的临时变量。类iterator_traits是一种允许进行此类声明的机制。
允许此类声明的最明显方法是要求所有迭代器声明嵌套类型;例如,迭代器I的值类型将是I::value_type。但是,这根本行不通。指针是迭代器,而指针不是类;如果I是(例如)int*,则不可能定义I::value_type为int。相反,I的值类型被写为iterator_traits<I>::value_type. iterator_traits是一个模板类,它除了嵌套的typedef之外什么也不包含;除了value_type, iterator_traits之外,它还定义了嵌套类型iterator_category, difference_type, pointer和reference.
库包含两个iterator_traits的定义:一个完全通用的定义,以及一个专门用于模板参数为指针类型的专门化 [1]。完全通用的版本将iterator_traits<I>::value_type定义为I::value_type, iterator_traits<I>::difference_type定义为I::difference_type的同义词,等等。由于指针没有嵌套类型,因此iterator_traits<T*>具有不同的定义。
实际上,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; };
如果要定义新的迭代器类型I,则必须确保iterator_traits<I>已正确定义。有两种方法可以做到这一点。首先,可以定义迭代器,使其拥有嵌套类型I::value_type, I::difference_type,等等。其次,可以为您的类型显式地专门化iterator_traits。但是,第一种方法通常更方便,尤其是因为可以通过继承基类之一来轻松确保迭代器拥有适当的嵌套类型input_iterator, output_iterator, forward_iterator, bidirectional_iterator或random_access_iterator.
请注意,iterator_traits是新添加的;它是在最近才添加到 C++ 标准草案中的。旧的 迭代器标签 机制和新的iterator_traits机制目前都受支持 [1],但旧的迭代器标签函数不再是标准 C++ 库的一部分,并且它们最终将被删除。
template <class InputIterator> iterator_traits<InputIterator>::value_type last_value(InputIterator first, InputIterator last) { iterator_traits<InputIterator>::value_type result = *first; for (++first; first != last; ++first) result = *first; return result; }
(注意:这是一个关于如何使用iterator_traits的示例;它不是良好的代码示例。有更好的方法可以找到 双向迭代器 甚至 前向迭代器 范围中的最后一个元素。)
参数 | 描述 | 默认值 |
---|---|---|
Iterator | 正在访问其关联类型的迭代器类型。 |
成员 | 描述 |
---|---|
iterator_category | 类型之一input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag或random_access_iterator_tag。迭代器的类别是它所模型化的 最具体的 迭代器概念。 |
value_type | Iterator的值类型,如 平凡迭代器 要求中所定义。 |
difference_type | Iterator的距离类型,如 输入迭代器 要求中所定义。 |
pointer | Iterator的指针类型:指向其值类型的指针。 |
reference | Iterator的引用类型:指向其值类型的引用。 |
[3] 类iterator_traits依赖于 C++ 中一个称为 偏特化 的特性。当今许多编译器都没有实现完整的标准;尤其是,许多编译器不支持偏特化。如果您的编译器不支持偏特化,则您将无法使用iterator_traits,并且您必须继续使用旧的迭代器标签函数iterator_category, distance_type和value_type。这是这些函数尚未被删除的一个原因。