C++ STL 反向迭代器rbegin()和end()到底指向了容器的哪里?

C++ STL中为我们提供了很方便的迭代器——反向迭代器,其功能是:对reverse_iterator执行递增操作将导致指向数据的指针被递减。为什么不直接对常规迭代器进行递减呢?主要原因是为了简化对已有的函数的使用。假设要反向显示dice容器的内容,可以使用copy()和ostream_iterator来将内容复制到输出流中:

ostream_iterator<int, char> out_iter(cout, " ");
copy(dice.rbegin(), dice.rend(), out_iter); // display in reverse order

rebegin()和end()返回相同的值(超尾),但类型不同(reverse_iterator和iterator)。同样,rend()和begin()也返回相同的值(指向第一个元素的迭代器),但类型不同。

假设rp是一个被初始化为dice.rbegin()的反转指针。那么*rp是什么呢?

  1. 因为rebegin()返回超尾,所以不能对该地址进行解引用。
  2. 同样,如果rend()是第一个元素的位置,则copy()将会提早一个位置停止,因为区间的结尾处不包括在区间中。

反向指针通过先递减,在解除引用解决了这两个问题。即 * rp将在 * rp的当前值之前对迭代器执行解除引用。也就是说,如果rp指向位置6,则* rp将是位置5的值,以此类推。

你可能感兴趣的:(C++,STL)