反向迭代器

如果我们想要向后遍历列表或向量,我们可以使用 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()