2013-02-27 136 views
5

我正在写一个iterator(实际上它是const_iterator我目前的目标,我希望也能创造一个reverse_const_iterator也。C++迭代和反向迭代

我环顾四周,看看如何做到这一点,我跨this偶然:

通知然而,当一个迭代反转时,反转版本 不指向该范围中的相同元件,但对一个 前述它之所以如此,以便安排为一个范围的过去最后 元素:它erator指向 中的过去末端元素,如果反转,则该范围将更改为指向范围的最后一个元素(不是 )(如果 已颠倒,这将是该范围的第一个元素)。如果某个范围中的第一个元素的迭代器与 相反,则反向迭代器指向第一个元素之前的元素(如果 颠倒过来,这将是该范围的过去末端元素)。

这是从用户的角度来看会发生什么,或者取消引用reverse_iterator给你,你认为它指向的对象的值/引用则它不是抽象的送人了?这只是实现细节?

我的理解是:

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

相当于

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

除了在反向。所以*i将在第一种情况下通过容器后退,并在第二种情况下通过容器前进。我的直觉是否正确?

+2

这只是工作。 – 2013-02-27 10:07:20

+0

附注:使用迭代器时,应始终使用前增量('++ i')而不是后增量,因为它可以更高效。 – 2014-04-25 13:24:05

回答

5

你说得对,它是一个抽象。反向迭代器包含一个正常的迭代器,如果你解除引用,它将指向你将得到的对象之后的元素。但是,这不仅仅是一个实现细节。 std::reverse_iterator适配器提供了一个成员函数调用base,它返回基础迭代器。

该标准定义std::reverse_iterator为具有以下关系的迭代器适配器给迭代其适配:

i由身份建立一个反向迭代和其相应的迭代器之间的基本关系:&*(reverse_iterator(i)) == &*(i - 1)

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

base的一个常见用途是从一个容器,这将像这样进行擦除元件

如果你想这样做,而遍历反向容器,你会怎么做:

it++; 
std::list<int>::reverse_iterator(lst.erase(it.base())); 
+0

作为一个侧面的问题,为什么要获得'base'底层'iterator'有用? – Bingo 2013-02-27 10:08:58

+0

@Bingo:因为容器可能期望它,例如,'erase'被指定为采用'iterator'和* not *'reverse_iterator'。 – 2013-02-27 10:11:16

+0

@Matthieu哦,对。这就说得通了。 – Bingo 2013-02-27 10:12:38