反向迭代器“对应”到具有base
一个元素偏移量的迭代器,因为如何rbegin()
并且rend()
必须使用有效的基本迭代器(end()
和begin()
分别)来表示。例如,rend()
不能用“指向”容器迭代器之前的begin()
迭代器来表示,尽管它在逻辑上是这样表示的。所以rend()
'基础迭代器'是begin()
. 因此,rbegin()
的基迭代器变为end()
。反向迭代器在取消引用时会自动调整该偏移量(使用*
or->
运算符)。
Scott Meyers的一篇旧文章详细解释了这种关系以及一张漂亮的图片:
准则 3:了解如何使用 reverse_iterator 的基本迭代器
在 reverse_iterator 上调用基成员函数会产生“对应的”迭代器,但不清楚这意味着什么。例如,看一下这段代码,它将数字 1-5 放入向量中,将 reverse_iterator 设置为指向 3,并将迭代器设置为 reverse_iterator 的基数:
vector<int> v;
// put 1-5 in the vector
for (int i = 1; i <= 5; ++i) {
v.push_back(i);
}
// make ri point to the 3
vector<int>::reverse_iterator ri =
find(v.rbegin(), v.rend(), 3);
// make i the same as ri's base
vector<int>::iterator i(ri.base());
执行此代码后,可以认为是这样的:
这张图很好,显示了 reverse_iterator 的特征偏移量及其相应的基本迭代器,它模仿了 rbegin() 和 rend() 相对于 begin() 和 end() 的偏移量,但它并没有告诉你你需要的一切要知道。特别是,它没有解释如何使用 i 来执行您想在 ri 上执行的操作。