【问题标题】:Canonical way to define forward output iterator定义前向输出迭代器的规范方法
【发布时间】:2012-12-27 22:49:54
【问题描述】:

如何以规范的方式在 C++11 中定义前向输出迭代器?

根据标准,forward_iterator 只是一个 input_iterator。所以对应的forward_iterator_tag只扩展了input_iterator_tag。如果我们使用std::iterator 来定义我们的迭代器,我们使用什么标签作为前向输出迭代器?

定义一个扩展forward_iterator_tagoutput_iterator_tag 的私有标签是否规范,或者有更好的解决方案吗?

【问题讨论】:

  • 从他们两个继承就可以了
  • 附带一个问题:有人知道这些可变迭代器标签是否被考虑用于标准库吗?如果是,为什么不包括在内?

标签: c++ c++11 iterator-traits


【解决方案1】:

规范的做法是仅从std::iterator<std::forward_iterator_tag, T> 继承。迭代器只有一个类别。

对于同时也是前向迭代器的输出迭代器,该标准没有算法(或其他用途)。标准中对输出迭代器的所有使用只需要单遍。

相反,该标准具有向前/双向/随机访问类别的可变与不可变迭代器的概念。所有需要通过迭代器写入的算法,并且需要比单次传递更好的算法,也可以通过它们写入的相同迭代器来读取。这是std::removestd::sort 和其他变异算法。

可变迭代器和不可变迭代器之间的区别不是通过迭代器标签来检测的,而是由赋值表达式是否格式良好来确定的。因此,例如,如果您将一个不可变的迭代器传递给std::sort,那么该算法无论如何都不会编译,因此通常不需要将输入迭代器也标记为output_iterator_tag。所有需要OutputIterator 的算法都可以使用可变的ForwardIterator,同样不需要使用output_iterator_tag 进行标记。

如果您的需求与标准算法的需求不同,那么我无法立即想到您的提案不适用于迭代器的原因。但它不会检测到可变的标准迭代器。例如std::deque<int>::iteratorint* 具有迭代器类别random_access_iterator_tag,不是您的私有标签,也与output_iterator_tag 无关。因此,您最好定义自己的特征类,而不是希望调整现有的iterator_traits::iterator_category 以提供您想要的信息。

【讨论】:

  • 谢谢!这让事情变得非常清楚。最后,这意味着不可变迭代器返回指向元素的 const 引用/副本,以防止通过返回的引用进行分配,对吧?
  • @MFH:没错。容器上的不可变迭代器返回const T&(我还没有检查这是否真的需要,或者是否允许它们返回代理)。其他不可变迭代器可以返回任何可转换为 T 的内容。
猜你喜欢
  • 2012-12-13
  • 2012-10-27
  • 2021-10-09
  • 2011-07-09
  • 2011-09-20
  • 2014-01-20
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多