类别:迭代器 | 组件类型:函数 |
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看起来像一个其返回类型取决于其参数类型的函数,但实际上它是一组函数;该名称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将被移除。
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。这是由于这些函数尚未删除的一个原因。