首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++迭代器和反向迭代器

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

Stack Overflow用户
提问于 2013-02-27 10:02:47
回答 1查看 9.6K关注 0票数 6

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

我环顾四周,想看看该怎么做,偶然发现了

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

这是从用户的角度来看发生的事情,还是当您取消引用一个reverse_iterator时,它不是通过提供您认为它所指向的对象的值/引用来将其抽象掉吗?这仅仅是实现细节吗?

我的理解是:

代码语言:javascript
复制
for(i = obj.rbegin(); i != obj.rend(); i++)

相当于

代码语言:javascript
复制
for(i = obj.begin(); i != obj.end(); i++)

除了相反的。因此,在第一种情况下,*i会向后穿过容器,在第二种情况下,通过容器向前移动。我的直觉正确吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-27 10:07:11

你说得对,这是一种抽象。反向迭代器包含一个普通迭代器,它指向如果取消引用对象将得到的对象之后的元素。然而,这不仅仅是一个实现细节。std::reverse_iterator适配器提供一个成员函数调用base,它返回底层迭代器。

该标准将std::reverse_iterator定义为迭代器适配器,与迭代器的适配关系如下:

逆迭代器与其对应迭代器I之间的基本关系是由恒等式&*(reverse_iterator(i)) == &*(i - 1)建立的。

base的一个常见用途是从容器中删除元素,如下所示:

代码语言:javascript
复制
it++;
lst.erase(it.base());

如果要在反向遍历容器时执行此操作,则应执行以下操作:

代码语言:javascript
复制
it++;
std::list<int>::reverse_iterator(lst.erase(it.base()));
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15109185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档