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