繁体   English   中英

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

[英]C++ iterator and reverse iterator

我正在写一个iterator (实际上它是我当前 object 的const_iterator ,我还想创建一个reverse_const_iterator

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

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

这是从用户的角度来看会发生什么,或者当您取消引用reverse_iterator时,它不会通过为您提供您认为它指向的 object 的值/引用来抽象它吗? 这只是实现细节吗?

我的理解是:

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

相当于

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

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

没错,这是一个抽象。 反向迭代器包含一个普通的迭代器,该迭代器指向在取消引用后将得到的对象之后的元素。 但是,这不仅仅是实现细节。 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()));

我不知道为什么会有反向迭代器,因为你可以很容易地坚持使用普通的迭代器,就像下面的代码一样:

while( x && it != str.begin() )
    *--it = "0123456789ABCDEF"[x % 16],
    x /= 16;
for( ; it != str.begin(); *--it = '0' );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM