5

我正在写一个iterator(实际上它是const_iterator针对我当前的对象,我也想创建一个reverse_const_iterator也。

我环顾四周,看看如何做到这一点,我偶然发现了这个

但是请注意,当迭代器被反转时,反转的版本不会指向范围内的相同元素,而是指向它之前的元素。就是这样,为了安排一个范围的最后一个元素:一个指向一个范围中一个过去的元素的迭代器,当反转时,被更改为指向最后一个元素(不超过它) 的范围(如果反转,这将是范围的第一个元素)。如果一个范围内第一个元素的迭代器被反转,反转的迭代器指向第一个元素之前的元素(如果反转,这将是范围的最后一个元素)。

这是从用户的角度发生的情况,还是当您取消引用 a 时reverse_iterator,它不会通过为您提供您认为它指向的对象的值/引用来抽象它吗?这只是实现细节吗?

我的理解是:

for(i = obj.rbegin(); i != obj.rend(); i++)

相当于

for(i = obj.begin(); i != obj.end(); i++)

除非反过来。所以*i在第一种情况下会向后穿过容器,在第二种情况下会向前穿过容器。我的直觉正确吗?

4

1 回答 1

5

你是对的,它是一个抽象。反向迭代器包含一个普通迭代器,它指向如果取消引用它会得到的对象之后的元素。然而,它不仅仅是一个实现细节。适配器提供了一个返回底层迭代器的std::reverse_iterator成员函数调用。base

该标准定义std::reverse_iterator了一个迭代器适配器,它与迭代器的适配关系如下:

反向迭代器与其对应的迭代器 i 之间的基本关系由恒等式建立:&*(reverse_iterator(i)) == &*(i - 1)

的一个常见用途base是从容器中删除一个元素,可以这样完成:

it++;
lst.erase(it.base());

如果您想在反向迭代容器时执行此操作,您可以执行以下操作:

it++;
std::list<int>::reverse_iterator(lst.erase(it.base()));
于 2013-02-27T10:07:11.667 回答