类别:迭代器、适配器 | 组件类型:类型 |
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]
参数 | 描述 | 默认值 |
---|---|---|
BidirectionalIterator | 基迭代器类。递增类对象reverse_bidirectional_iterator<BidirectionalIterator>对应于递减类对象BidirectionalIterator. | |
T | 反向迭代器的值类型。这始终应该与基迭代器的值类型相同。 | |
Reference | 反向迭代器的引用类型。这始终应该与基迭代器的引用类型相同。 | T& |
Distance | 反向迭代器的距离类型。这始终应该与基迭代器的距离类型相同。 | ptrdiff_t |
成员 | 定义位置 | 描述 |
---|---|---|
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&) | 迭代器标签 | 返回迭代器的距离类型。这是一个全局函数,而不是成员函数。 |
成员 | 描述 |
---|---|
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_type和value_type正确。迭代器特征 类解决了这个问题:它解决了与迭代器标签函数相同的问题,但更简洁、更灵活。然而,迭代器特征依赖于部分特化,而许多 C++ 编译器尚未实现部分特化。一旦支持部分特化的编译器变得更加普遍,这两个不同的反向迭代器类将合并成一个类。
[2] 的声明rfirst和rlast以这种笨拙的形式编写仅仅是为了说明如何声明一个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.