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

时间:2014-10-07 05:59:52

标签: c++ stl iterator

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

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

当我们 it ++ 时,它将转移到下一个索引。这对我来说很清楚,但我完全与反向迭代器混淆。

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

当我们 rit ++ 时,它会向后移动。我想知道在反向迭代器的情况下如何实现它。是运营商超载还是我不知道的事情。请给我正确的方法来理解这些事情。

请提供更详细的知识。

6 个答案:

答案 0 :(得分:2)

当你执行it++rit++时,它们并不意味着“在集合中向前或向后移动”,它们都意味着“移动到您要迭代的下一个元素”。< / p>

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

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

答案 1 :(得分:2)

  

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

关闭,但不一定:

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

  • end()返回一个理论上“超过”最后一个有效索引的迭代器。

vector iterator内部通常会存储指针,而++上的--iterator会通过转发重载运算符来执行指针上对应的++--

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

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

    _Myt  operator++(int)
            {
            _Myt _Tmp = *this;
            --current;
            return (_Tmp);
            }

答案 2 :(得分:1)

_***************_
 ^begin ++--->  ^end
^rend <---++   ^rbegin

答案 3 :(得分:0)

是的,这是运营商重载。执行rit++时,编译器会在内部翻译

rit.operator++(0);

这里,operator++是反向迭代器类的一种方法,它知道如何移动迭代器。 differentiate between prefix and postfix operator++需要伪整数参数。

答案 4 :(得分:0)

是的,reverse_iterator::operator++过载导致&#34;倒退&#34;从最后一个元素到一个在开始之前。

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

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

请注意,如何完成此操作可能因实现而异。只要您符合标准要求,您就有一定的自由度。

答案 5 :(得分:0)

反向迭代器r和它构造的迭代器之间的关系是:

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

如果 end 是序列中的一个过去的元素,则反向序列中的第一个元素指向*( end - 1)< / p>