我正在写一个iterator
(实际上它是const_iterator
用于我当前的对象,我还想创建一个reverse_const_iterator
。
我环顾四周,看看如何做到这一点,我偶然发现了this:
但请注意,当迭代器反转时,反转版本 不指向范围内的相同元素,而是指向一个元素 在它之前。就是这样,为了安排过去 范围的元素:指向过去的结束元素的迭代器 当反转时,范围被改变为指向最后一个元素(不是 超出范围(这将是范围的第一个元素) 相反)。如果是范围中第一个元素的迭代器是 反转,反转的迭代器指向第一个之前的元素 元素(这将是范围的过去元素if 反转)。
这是从用户的角度出现的情况,还是当您取消引用reverse_iterator
时,它不会通过为您提供您认为的对象的值/引用来抽象它指向?这只是实施细节吗?
我的理解是:
for(i = obj.rbegin(); i != obj.rend(); i++)
相当于
for(i = obj.begin(); i != obj.end(); i++)
除了相反。因此*i
将在第一种情况下向后通过容器,并在第二种情况下向前通过容器。我的直觉是否正确?
答案 0 :(得分:5)
你是对的,它是一种抽象。反向迭代器包含一个普通迭代器,如果你取消引用它,它将指向你将获得的对象之后的元素。但是,它不仅仅是一个实现细节。 std::reverse_iterator
适配器提供了一个成员函数调用base
,它返回底层迭代器。
标准将std::reverse_iterator
定义为迭代器适配器,它与迭代器的适应性有以下关系:
反向迭代器与其对应的迭代器之间的基本关系由身份建立:
&*(reverse_iterator(i)) == &*(i - 1)
base
的一个常见用法是从容器中删除一个元素,这样就可以这样做:
it++;
lst.erase(it.base());
如果你想在反向迭代容器时这样做,你可以这样做:
it++;
std::list<int>::reverse_iterator(lst.erase(it.base()));