C ++迭代器和反向迭代器

时间:2013-02-27 10:02:47

标签: c++ iterator

我正在写一个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将在第一种情况下向后通过容器,并在第二种情况下向前通过容器。我的直觉是否正确?

1 个答案:

答案 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()));