SGI

iterator_traits<Iterator>

类别: 迭代器 组件类型: 类型

描述

迭代器概述 中所述,迭代器最重要的特性之一是它们拥有关联的类型。例如,迭代器类型拥有一个关联的 值类型:迭代器所指向的对象类型。它还拥有一个关联的 距离类型差值类型,这是一种带符号的整型类型,可以用于表示两个迭代器之间的距离。

(例如,指针是迭代器;int*的值类型是int。它的距离类型是ptrdiff_t,因为如果p1p2是指针,则表达式p1 - p2的类型为ptrdiff_t.)

泛型算法通常需要访问这些关联类型;例如,一个接受迭代器范围的算法可能需要声明一个类型为迭代器值类型的临时变量。类iterator_traits是一种允许进行此类声明的机制。

允许此类声明的最明显方法是要求所有迭代器声明嵌套类型;例如,迭代器I的值类型将是I::value_type。但是,这根本行不通。指针是迭代器,而指针不是类;如果I是(例如)int*,则不可能定义I::value_typeint。相反,I的值类型被写为iterator_traits<I>::value_type. iterator_traits是一个模板类,它除了嵌套的typedef之外什么也不包含;除了value_type, iterator_traits之外,它还定义了嵌套类型iterator_category, difference_type, pointerreference.

库包含两个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_iteratorrandom_access_iterator.

请注意,iterator_traits是新添加的;它是在最近才添加到 C++ 标准草案中的。旧的 迭代器标签 机制和新的iterator_traits机制目前都受支持 [1],但旧的迭代器标签函数不再是标准 C++ 库的一部分,并且它们最终将被删除。

示例

此泛型函数返回非空范围中的最后一个元素。请注意,无法使用旧的value_type函数来定义具有此接口的函数,因为函数的返回值类型必须声明为迭代器的值类型。
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.h 中定义。

模板参数

参数 描述 默认值
Iterator 正在访问其关联类型的迭代器类型。  

模型

默认可构造可赋值

类型要求

公共基类

无。

成员

无,除了嵌套类型。
成员 描述
iterator_category 类型之一input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tagrandom_access_iterator_tag。迭代器的类别是它所模型化的 最具体的 迭代器概念。
value_type Iterator的值类型,如 平凡迭代器 要求中所定义。
difference_type Iterator的距离类型,如 输入迭代器 要求中所定义。
pointer Iterator的指针类型:指向其值类型的指针。
reference Iterator的引用类型:指向其值类型的引用。

备注

[3]iterator_traits依赖于 C++ 中一个称为 偏特化 的特性。当今许多编译器都没有实现完整的标准;尤其是,许多编译器不支持偏特化。如果您的编译器不支持偏特化,则您将无法使用iterator_traits,并且您必须继续使用旧的迭代器标签函数iterator_category, distance_typevalue_type。这是这些函数尚未被删除的一个原因。

另请参阅

迭代器概述迭代器标签input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag, input_iterator, output_iterator, forward_iterator, bidirectional_iterator, random_access_iterator
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息