繁体   English   中英

C ++中的反向迭代器如何工作

[英]How Reverse Iterator in C++ works

我是C ++的初学者,我想知道操作符++如何将迭代器向后移动。 据我所知,iterator.begin()和iterator.end()分别返回指向第一个索引和最后一个索引的指针。

vector<int>::iterator it = myvector.begin();

当我们执行++时 ,它将移至下一个索引。 这对我来说很清楚,但是我完全对反向迭代器感到困惑。

vector<int>::reverse_iterator rit = myvector.rbegin();

当我们使用rit ++时 ,它将向后移动。 我想知道在反向迭代器的情况下该如何实现。 是运算符重载还是我不知道的东西。 请给我正确的方式来理解这些东西。

请提供更多详细知识。

当您执行it++rit++它们并不是真正意义上的“向前或向后移动集合”,而是都意味着“方向上要迭代的下一个元素”。

如果使用begin() ,则表示“我想向前迭代”,因此it++向前移动。

如果使用rbegin() ,则表示“我想向后迭代”,因此rit++向后移动。

据我所知, iterator.begin()iterator.end()返回指向第一个索引和最后一个索引的指针。

关闭,但不一定:

  • 他们返回iterator s,而不是指针。

  • end()返回一个迭代器,该迭代器在概念上“粘贴”了最后一个有效索引。

在内部, vector iterator通常确实会存储指针,并且iterator上的++--将通过转发重载运算符对指针执行相应的++--

对于反向迭代器,重载的operator++只会在指针上执行-- ,反之亦然。 例如,我计算机上的Visual C ++库在class _Revranit执行此class _Revranit ,从class _Revranit reverse_iterator

    _Myt&  operator++()
            {
            --current;
            return (*this);
            }

    _Myt  operator++(int)
            {
            _Myt _Tmp = *this;
            --current;
            return (_Tmp);
            }
_***************_
 ^begin ++--->  ^end
^rend <---++   ^rbegin

是的,这是操作员超载。 当您执行rit++ ,编译器会在内部进行翻译

rit.operator++(0);

在这里, operator++是反向迭代器类的一种方法,它知道如何移动迭代器。 需要虚拟整数参数来区分前缀和后缀operator++

是的,有一个reverse_iterator :: operator ++重载,它从最后一个元素“向后”推进到开始之前。

该行为等同于(cppreference上的页面可能包含另一个可能的实现)

    reverse_iterator operator++(int)
    {
      reverse_iterator __tmp(*this); 
      --current; // This is an internal iterator
      return __tmp;
    }

请注意,具体实现的方式可能因实现而异。 只要您符合标准要求,就可以享有一定程度的自由度。

反向迭代器r和从其构造的迭代器i之间的关系为:

&*r == &*(i-1)

如果end是序列中的最后一个元素,则反向序列中的第一个元素指向*( end – 1)

暂无
暂无

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

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