SGI

iterator_category

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

原型

Iterator_category已重载 iterator_category,实际上是六个不同的函数。
inline output_iterator_tag iterator_category(const output_iterator&);

template <class T, class Distance> 
inline input_iterator_tag 
iterator_category(const input_iterator<T, Distance>&);

template <class T, class Distance> 
inline forward_iterator_tag 
iterator_category(const forward_iterator<T, Distance>&);

template <class T, class Distance> 
inline bidirectional_iterator_tag 
iterator_category(const bidirectional_iterator<T, Distance>&);

template <class T, class Distance> 
inline random_access_iterator_tag 
iterator_category(const random_access_iterator<T, Distance>&);

template <class T>
inline random_access_iterator_tag iterator_category(const T*);

描述

Iterator_category是一个 迭代器标记 函数:它用于确定迭代器所属的类别。具体而言,每个迭代器都必须属于建模概念的类型 输出迭代器输入迭代器前向迭代器双向迭代器随机访问迭代器[1]Iterator_category返回类对象output_iterator_tag, input_iterator_tag, forward_iterator_tagrandom_access_iterator_tag,具体取决于iterator_category参数的类型是建模的哪个概念。[2]当算法针对多个类别的迭代器都有合理的定义,但其定义根据不同的类别而不同时,此信息非常有用。

尽管iterator_category看起来像一个其返回类型取决于其参数类型的函数,但实际上它是一组函数;该名称iterator_category已重载。函数iterator_category必须针对每种迭代器类型进行重载。

实际上,确保iterator_category定义基本上无需任何工作。它已针对指针以及基类input_iterator, output_iterator, forward_iterator, bidirectional_iterator以及random_access_iterator进行定义。如果您要实现新类型的前向迭代器(例如),可以简单地从基类forward_iterator派生它;这意味着iterator_category(以及distance_type以及value_type),将自动为您的迭代器进行定义。这些基类为空:它们不包含任何成员函数或成员变量,仅包含类型信息。因此,使用它们不会产生开销。

请注意,虽然函数iterator_category在原始 STL 中存在,但在最新草案的 C++ 标准中已经不存在:它已被iterator_traits类取代。当前,两种机制均受支持 [3],但最终会iterator_category将被移除。

定义

在标准头文件 iterator 和非标准后向兼容头文件 iterator.h 中定义。此函数不再是 C++ 标准的一部分,尽管它存在于标准的早期草案中。它保留在此实现中以实现后向兼容性。

对类型的要求

的参数iterator_category必须是迭代器。

前提条件

无。Iterator_category的参数甚至允许是奇异迭代器。

复杂度

至多摊销常量时间。在许多情况下,编译器应该能够对iterator_category进行完全优化。

示例

逆转可以为 双向迭代器随机存取迭代器 实施,但 随机存取迭代器 的算法更高效。因此,reverse使用iterator_category选择适合迭代器类型的算法。此分派在编译时进行,并且不应产生任何运行时损失。
template <class BidirectionalIterator>
void __reverse(BidirectionalIterator first, BidirectionalIterator last, 
               bidirectional_iterator_tag) {
    while (true)
        if (first == last || first == --last)
            return;
        else
            iter_swap(first++, last);
}

template <class RandomAccessIterator>
void __reverse(RandomAccessIterator first, RandomAccessIterator last,
               random_access_iterator_tag) {
    while (first < last) iter_swap(first++, --last);
}

template <class BidirectionalIterator>
inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {
    __reverse(first, last, iterator_category(first));
}

注释

[1] STL 还定义了一个其他概念 平凡迭代器。但是,仅为概念清晰引入此概念,以将与引用另一个对象的的对象相关的公理与与范围内进行迭代相关的公理分开。事实上,STL 不会定义任何 平凡迭代器 类型。虽然内置的 C 指针可以是 平凡迭代器,但 C 类型系统不允许区分是 平凡迭代器 的指针还是进入 C 数组的 随机存取迭代器 的指针。因此,没有 平凡迭代器 分类标记。

[2] 任何符合 向前迭代器 的模型的类型也是 输入迭代器 的模型,任何符合 双向迭代器 的模型的类型也是 向前迭代器 的模型,任何符合 随机存取迭代器 的模型的类型也是 双向迭代器 的模型。Iterator_category必须返回表示其自变量符合的最具体概念的标记。如果其自变量是vector::iterator,例如,则它必须返回random_access_iterator_tag.

[3]iterator_traits类依赖于被称为部分特化的 C++ 功能。现在许多编译器都没有实现完整标准;特别是,许多编译器不支持部分特化。如果您的编译器不支持部分特化,则您将无法使用iterator_traits,并且您将必须继续使用函数iterator_category, distance_type以及value_type。这是由于这些函数尚未删除的一个原因。

请参见

迭代器标记 概述,iterator_traits, distance_type, value_type, output_iterator_tag, input_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics,Inc. 保留所有权利。 商標信息