SGI

reverse_iterator<RandomAccessIterator, T, Reference, Distance>

类别:迭代器、适配器 组件类型:类型

描述

Reverse_iterator是一个迭代器适配器,可进行范围的反向遍历。操作符 ++应用于类的对象reverse_iterator<RandomAccessIterator>operator--应用于类的对象RandomAccessIterator的含义相同。有两种不同的反向迭代器适配器:类reverse_iterator有一个模板参数,它是 随机访问迭代器,而类reverse_bidirectional_iterator有一个模板参数,它是 双向迭代器[1]

示例

template <class T>
void forw(const vector<T>& V)
{
   vector<T>::iterator first = V.begin();
   vector<T>::iterator last = V.end();
   while (first != last) 
      cout << *first++ << endl;
}      

template <class T>
void rev(const vector<T>& V)
{
   typedef reverse_iterator<vector<T>::iterator,
                            T,
                            vector<T>::reference_type,
                            vector<T>::difference_type> 
           reverse_iterator; [2]
   reverse_iterator rfirst(V.end());
   reverse_iterator rlast(V.begin());

   while (rfirst != rlast) 
      cout << *rfirst++ << endl;
}      

在函数forw中,元素按以下顺序打印*first, *(first+1), ..., *(last-1)。在函数rev中,它们按以下顺序打印*(last - 1), *(last-2), ..., *first. [3]

定义

在标准头 iterator 中定义,在非标准向后兼容头 iterator.h 中定义。

模板参数

参数 描述 默认值
RandomAccessIterator 基迭代器类,递增类对象reverse_iterator<Iterator>等同于递减类对象Iterator.  
T 反向迭代器的值类型。它应该始终和基迭代器的值类型相同。  
Reference 反向迭代器的引用类型。它应该始终和基迭代器的引用类型相同。 T&
Distance 反向迭代器的距离类型。它应该始终和基迭代器的距离类型相同。 ptrdiff_t

模型

随机访问迭代器

类型要求

基迭代器类型(即模板参数RandomAccessIterator)必须是随机访问迭代器。的reverse_iterator的值类型、引用类型和距离类型(即模板参数T, ReferenceDistance)也必须和基迭代器的值类型、引用类型和距离类型相同。

公共基类

无。

成员

成员 定义位置 描述
self reverse_iterator 如下
reverse_iterator() 平凡迭代器 默认构造函数
reverse_iterator(const reverse_iterator& x) 平凡迭代器 拷贝构造函数
reverse_iterator& operator=(const reverse_iterator& x) 平凡迭代器 赋值运算符
reverse_iterator(RandomAccessIterator x) reverse_iterator 如下。
RandomAccessIterator base() reverse_iterator 如下。
引用操作符 *() const 平凡迭代器 解除引用运算符
reverse_iterator& operator++() 正向迭代器 前缀自增
reverse_iterator operator++(int) 正向迭代器 后缀自增
reverse_iterator& operator--() 双向迭代器 先行递减
reverse_iterator operator--(int) 双向迭代器 后置递减
reverse_iterator operator+(Distance) 随机访问迭代器 迭代器相加
reverse_iterator& operator+=(Distance) 随机访问迭代器 迭代器相加
reverse_iterator operator-(Distance) 随机访问迭代器 迭代器相减
reverse_iterator& operator-=(Distance) 随机访问迭代器 迭代器相减
引用运算符[](Distance) 随机访问迭代器 随机访问元素。
reverse_iterator operator+(Distance, reverse_iterator) 随机访问迭代器 迭代器相加。这是一个全局函数,不是成员函数。
Distance operator-(const reverse_iterator&, const reverse_iterator&) 随机访问迭代器 查找两个迭代器之间的距离。这是一个全局函数,不是成员函数。
bool operator==(const reverse_iterator&, const reverse_iterator&) 平凡迭代器 比较两个迭代器的相等性。这是一个全局函数,不是成员函数。
bool operator<(const reverse_iterator&, const reverse_iterator&) 随机访问迭代器 确定第一个参数是否在第二个参数之前。这是一个全局函数,不是成员函数。
random_access_iterator_tag iterator_category(const reverse_iterator&) 迭代器标记 返回迭代器的类别。这是一个全局函数,不是成员函数。
T* value_type(const reverse_iterator&) 迭代器标记 返回迭代器的值类型。这是一个全局函数,不是成员函数。
Distance* distance_type(const reverse_iterator&) 迭代器标记 返回迭代器的距离类型。这是一个全局函数,不是成员函数。

新成员

这些成员未在随机访问迭代器需求中定义,但特定于reverse_iterator.
成员 描述
self 一个reverse_iterator<RandomAccessIterator, T, Reference, Distance>.
RandomAccessIterator base() 返回reverse_iterator的基本迭代器当前的值。如果ri是一个逆迭代器和i是任何迭代器,则可以将逆迭代器的两个基本恒等写成reverse_iterator(i).base() == i&*ri == &*(ri.base() - 1).
reverse_iterator(RandomAccessIterator i) 构建一个reverse_iterator其基础迭代器是i.

备注

[1]有两个单独的类实际上没有任何很好的理由:这种分离仅仅是因为当今一些 C++ 编译器中的技术限制。如果将这两个类合并为一个类,则无法声明迭代器标记函数的返回类型iterator_category, distance_typevalue_type正确。迭代器特征类解决了此问题:它解决了与迭代器标记函数相同的问题,但方式更简洁、更灵活。但是,迭代器特征依赖于部分特化,并且许多 C++ 编译器尚未实现部分特化。一旦支持部分特化的编译器变得更常见,这两个不同的逆迭代器类将被合并到一个类中。

[2]rfirstrlast编写的声明采用这种笨拙的形式,只是为了说明如何声明一个reverse_iterator. Vector是一个 可逆容器,因此它为该实例化的适当类型定义提供了一个 typedefreverse_iterator声明这些变量的通常方法更简单

    vector<T>::reverse_iterator rfirst = rbegin();
    vector<T>::reverse_iterator rlast = rend();

[3] 请注意此备注的含义。变量rfirst初始化为reverse_iterator<...> rfirst(V.end());。但是,对其进行解引用时获得的值为*(V.end() - 1)。这是一个常规属性:反向迭代器的基本等效性是&*(reverse_iterator(i)) == &*(i - 1)。此代码示例展示了此等效性为何重要:如果[f, l)是一个有效范围,则它允许[reverse_iterator(l), reverse_iterator(f))也是一个有效范围。请注意,迭代器l不属于此范围,但需要能够对其进行解引用或者位于末尾之后。没有要求任何此类迭代器位于f.

之前。另请参阅

可逆容器reverse_bidirectional_iterator随机访问迭代器迭代器标记迭代器概述
[Silicon Surf] [STL Home]
版权 © 1999 Silicon Graphics, Inc. 保留所有权利。 TrademarkInformation