【问题标题】:Can I use reverse iterator as ForwardIt?我可以使用反向迭代器作为 ForwardIt 吗?
【发布时间】:2020-10-28 07:35:55
【问题描述】:

基于this questionstd::rotate 定义如下:

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

查看名称ForwardIt,它需要前向迭代器。

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

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

【问题讨论】:

标签: c++ iterator reverse-iterator


【解决方案1】:

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

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

iterator_category — 如果std::iterator_traits&lt;Iter&gt;::iterator_category 模型std::derived_from&lt;std::random_access_iterator_tag&gt;,则这是std::random_access_iterator_tag。否则,std::iterator_traits&lt;Iter&gt;::iterator_category 不变。

鉴于原始迭代器必须至少是双向的(请参阅链接),这意味着生成的迭代器要么是随机访问的(如果原始迭代器至少是随机访问的),要么是双向的(否则)。

(这里使用std::derived_from是因为当A是B的子集时,A类继承自B类,这意味着A的需求是B需求的超集。从random_access_iterator_tag继承的唯一东西是@ 987654330@.)

【讨论】:

    【解决方案2】:

    reverse_iterator的要求在reverse.iter.requirements中给出:

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

    以及iterator.concept.bidir的要求:

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

    所以是的,reverse_iterator 可以用作forward_iterator

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 2018-04-20
      • 2021-04-16
      • 2020-01-05
      • 1970-01-01
      相关资源
      最近更新 更多