[英]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.