SGI

reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, Distance>

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

描述

Reverse_bidirectional_iterator是一个迭代器适配器,它允许反向遍历一个范围。运算符++应用于类对象reverse_bidirectional_iterator<BidirectionalIterator>意味着与运算符--应用于类对象BidirectionalIterator相同。有两种不同的反向迭代器适配器:类reverse_bidirectional_iterator有一个模板参数,它是 双向迭代器,而类reverse_iterator有一个模板参数,它是 随机访问迭代器[1]

示例

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

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

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

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

定义

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

模板参数

参数 描述 默认值
BidirectionalIterator 基迭代器类。递增类对象reverse_bidirectional_iterator<BidirectionalIterator>对应于递减类对象BidirectionalIterator.  
T 反向迭代器的值类型。这始终应该与基迭代器的值类型相同。  
Reference 反向迭代器的引用类型。这始终应该与基迭代器的引用类型相同。 T&
Distance 反向迭代器的距离类型。这始终应该与基迭代器的距离类型相同。 ptrdiff_t

模型

双向迭代器.

类型要求

基迭代器类型(即模板参数BidirectionalIterator)必须是双向迭代器。的reverse_bidirectional_iterator值类型、引用类型和距离类型(即模板参数T, ReferenceDistance分别)必须与基迭代器的值类型、引用类型和距离类型相同。

公共基类

无。

成员

成员 定义位置 描述
self reverse_bidirectional_iterator 见下文
reverse_bidirectional_iterator() 平凡迭代器 默认构造函数
reverse_bidirectional_iterator(const reverse_bidirectional_iterator& x) 平凡迭代器 复制构造函数
reverse_bidirectional_iterator& operator=(const reverse_bidirectional_iterator& x) 平凡迭代器 赋值运算符
reverse_bidirectional_iterator(BidirectionalIterator x) reverse_bidirectional_iterator 见下文。
BidirectionalIterator base() reverse_bidirectional_iterator 见下文。
Reference operator*() const 平凡迭代器 解引用运算符
reverse_bidirectional_iterator& operator++() 前向迭代器 前置递增
reverse_bidirectional_iterator operator++(int) 前向迭代器 后置递增
reverse_bidirectional_iterator& operator--() 双向迭代器 前置递减
reverse_bidirectional_iterator operator--(int) 双向迭代器 后置递减
bool operator==(const reverse_bidirectional_iterator&, const reverse_bidirectional_iterator&) 平凡迭代器 比较两个迭代器是否相等。这是一个全局函数,而不是成员函数。
bidirectional_iterator_tag iterator_category(const reverse_bidirectional_iterator&) 迭代器标签 返回迭代器的类别。这是一个全局函数,而不是成员函数。
T* value_type(const reverse_bidirectional_iterator&) 迭代器标签 返回迭代器的值类型。这是一个全局函数,而不是成员函数。
Distance* distance_type(const reverse_bidirectional_iterator&) 迭代器标签 返回迭代器的距离类型。这是一个全局函数,而不是成员函数。

新成员

这些成员没有在 双向迭代器 要求中定义,而是特定于reverse_bidirectional_iterator.
成员 描述
self reverse_bidirectional_iterator<BidirectionalIterator, T, Reference, Distance>.
双向迭代器 base() 返回reverse_bidirectional_iterator的基迭代器的当前值。如果ri是反向迭代器,而i是任何迭代器,则反向迭代器的两个基本恒等式可以写成reverse_bidirectional_iterator(i).base() == i&*ri == &*(ri.base() - 1).
reverse_bidirectional_iterator(BidirectionalIterator i) 构造一个reverse_bidirectional_iterator,其基迭代器是i.

备注

[1] 实际上没有充分的理由使用两个独立的类:这种分离纯粹是由于当今某些 C++ 编译器中的技术限制。如果将这两个类合并成一个,那么就无法声明 迭代器标签 函数的返回值类型iterator_category, distance_typevalue_type正确。迭代器特征 类解决了这个问题:它解决了与迭代器标签函数相同的问题,但更简洁、更灵活。然而,迭代器特征依赖于部分特化,而许多 C++ 编译器尚未实现部分特化。一旦支持部分特化的编译器变得更加普遍,这两个不同的反向迭代器类将合并成一个类。

[2] 的声明rfirstrlast以这种笨拙的形式编写仅仅是为了说明如何声明一个reverse_bidirectional_iterator. List可逆容器,因此它为的适当实例化提供了一个 typedefreverse_bidirectional_iterator。声明这些变量的通常方式要简单得多

    list<T>::reverse_bidirectional_iterator rfirst = rbegin();
    list<T>::reverse_bidirectional_iterator rlast = rend(); 

[3] 注意此备注的含义。变量rfirst初始化为reverse_bidirectional_iterator<...> rfirst(V.end());。然而,在对其解引用时获得的值是*(V.end() - 1)。这是一个普遍的属性:反向迭代器的基本恒等式是&*(reverse_bidirectional_iterator(i)) == &*(i - 1)。此代码示例展示了为什么此恒等式很重要:如果[f, l)是一个有效范围,那么它允许[reverse_bidirectional_iterator(l), reverse_bidirectional_iterator(f))也是一个有效范围。请注意,迭代器l不是范围的一部分,但它需要可解引用或为超出范围的迭代器。没有任何要求规定此类迭代器在f.

之前

另请参见
[Silicon Surf] [STL Home]
可逆容器reverse_iterator双向迭代器迭代器标签迭代器概述 Copyright © 1999 Silicon Graphics, Inc. 保留所有权利。