规范正向输出迭代器的规范方法

时间:2012-12-27 22:49:54

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

如何以规范的方式在C ++ 11中定义forward-output-iterators?

根据标准,forward_iterator只是一个input_iterator。因此,相应的forward_iterator_tag仅展开input_iterator_tag。如果我们使用std::iterator来定义迭代器,我们使用什么标记作为正向输出迭代器?

定义一个扩展forward_iterator_tagoutput_iterator_tag的私有标记或者是否有更好的解决方案是否正常?

1 个答案:

答案 0 :(得分:6)

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

标准没有用于输出迭代器的算法(或其他用途),输出迭代器也是前向迭代器。标准中输出迭代器的所有使用仅需要单次传递。

相反,该标准具有类别forward / bidi / randomaccess的可变与不可变迭代器的概念。所有需要通过迭代器编写的算法,以及需要比单次传递更好的算法,也会读取它们写入的相同迭代器。这是std::removestd::sort和其他变异算法。

iterator标记未检测到mutable和immutable迭代器之间的区别,它取决于赋值表达式是否格式正确。因此,例如,如果将迭代器传递给不可变的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来提供您想要的信息。