0

基于这个问题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()文档没有提到是否是这种情况。

4

2 回答 2

2

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

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

iterator_category— 如果是std::iterator_traits<Iter>::iterator_category模型std::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。)

于 2020-07-08T00:08:46.620 回答
1

的要求reverse_iteratorreverse.iter.requirements中给出:

模板参数 Iterator 应满足 Cpp17BidirectionalIterator ([bidirectional.iterators]) 或模型 bidirectional_iterator ([iterator.concept.bidir]) 的要求。

以及iterator.concept.bidir的要求:

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

所以是的, areverse_iterator可以用作 a forward_iterator

于 2020-07-08T00:11:11.963 回答