我是c ++的初学者,我想知道operator ++如何向后移动迭代器。我知道iterator.begin()和iterator.end()分别返回指向第一个索引和最后一个索引的指针。
vector<int>::iterator it = myvector.begin();
当我们 it ++ 时,它将转移到下一个索引。这对我来说很清楚,但我完全与反向迭代器混淆。
vector<int>::reverse_iterator rit = myvector.rbegin();
当我们 rit ++ 时,它会向后移动。我想知道在反向迭代器的情况下如何实现它。是运营商超载还是我不知道的事情。请给我正确的方法来理解这些事情。
请提供更详细的知识。
答案 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>