我可以使用反向迭代器作为ForwardIt吗

Can I use reverse iterator as ForwardIt?

本文关键字:ForwardIt 迭代器 可以使 我可以      更新时间:2023-10-16

基于这个问题。std::rotate定义如下:

template< class ForwardIt >
constexpr ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );

从名称ForwardIt来看,它期望使用前向迭代器。

问题:假设我的初始集合支持正向迭代器(例如vector(,我可以在这里使用反向迭代器吗?为什么/为什么不?

例如,http://www.cplusplus.com/reference/iterator/reverse_iterator/,我不明白返回的内容是否被视为前向迭代器。我必须保证反向迭代器满足正向迭代器的属性吗?在这种情况下,我如何检查它是真的?vector::rbegin((文档没有提到是否是这种情况。

查看iterator_category成员typedef。迭代程序通过将其类别设置为适当的标记来报告其类别。

[https://en.cppreference.com/w/cpp/iterator/reverse_iterator]

iterator_category——如果std::iterator_traits<Iter>::iterator_categorystd::derived_from<std::random_access_iterator_tag>建模,则此为std::random_access_iterator_tag。否则,这是std::iterator_traits<Iter>::iterator_category不变。

给定原始迭代器必须至少是双向的(请参阅链接(,这意味着生成的迭代器要么是随机访问的(如果原始迭代程序至少是随机访问(,要么是双向的。

(这里使用std::derived_from是因为当A是B的子集时,类别A继承自类别B,这意味着A的需求是B的需求的超集。唯一继承自random_access_iterator_tag的是contiguous_iterator_tag。(

reverse_iterator的要求以相反的方式给出。其他要求:

模板参数Iterator应满足Cpp17BidirectionalIterator([双向.iterators](或模型双向迭代器([迭代器概念.bidir](的要求。

和迭代器的要求

双向迭代器概念增加了向前和向后移动迭代器的能力。

所以是的,reverse_iterator可以用作forward_iterator