反向迭代器
如果我们想要向后遍历列表或向量,我们可以使用 reverse_iterator
。反向迭代器由双向或随机访问迭代器构成,它作为成员保存,可以通过 base()
访问。
要向后迭代,请使用 rbegin()
和 rend()
作为集合结束的迭代器,以及集合的开始。
例如,向后迭代使用:
std::vector<int> v{1, 2, 3, 4, 5};
for (std::vector<int>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it)
{
cout << *it;
} // prints 54321
可以通过 base()
成员函数将反向迭代器转换为前向迭代器。关系是反向迭代器引用一个元素超过 base()
迭代器:
std::vector<int>::reverse_iterator r = v.rbegin();
std::vector<int>::iterator i = r.base();
assert(&*r == &*(i-1)); // always true if r, (i-1) are dereferenceable
// and are not proxy iterators
+---+---+---+---+---+---+---+
| | 1 | 2 | 3 | 4 | 5 | |
+---+---+---+---+---+---+---+
↑ ↑ ↑ ↑
| | | |
rend() | rbegin() end()
| rbegin().base()
begin()
rend().base()
在迭代器标记元素之间位置的可视化中,关系更简单:
+---+---+---+---+---+
| 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+
↑ ↑
| |
| end()
| rbegin()
begin() rbegin().base()
rend()
rend().base()