我正在编写一个iterator (实际上,它是当前对象的const_iterator,我还想要创建一个reverse_const_iterator。
我环顾四周,想看看该怎么做,偶然发现了这。
但是,请注意,当迭代器被反转时,反向版本并不指向范围中的相同元素,而是指向其前面的元素。这是这样的,为了安排范围的过去结束元素:指向范围中的过去结束元素的迭代器,当反转时,被更改为指向范围的最后一个元素(如果反转,这将是范围的第一个元素)。如果对范围中的第一个元素的迭代器反转,则反向迭代器指向第一个元素之前的元素(如果反转,这将是范围的过去结束元素)。
这是从用户的角度来看发生的事情,还是当您取消引用一个reverse_iterator时,它不是通过提供您认为它所指向的对象的值/引用来将其抽象掉吗?这仅仅是实现细节吗?
我的理解是:
for(i = obj.rbegin(); i != obj.rend(); i++)相当于
for(i = obj.begin(); i != obj.end(); i++)除了相反的。因此,在第一种情况下,*i会向后穿过容器,在第二种情况下,通过容器向前移动。我的直觉正确吗?
发布于 2013-02-27 10:07:11
你说得对,这是一种抽象。反向迭代器包含一个普通迭代器,它指向如果取消引用对象将得到的对象之后的元素。然而,这不仅仅是一个实现细节。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()));https://stackoverflow.com/questions/15109185
复制相似问题