如何以规范的方式在C ++ 11中定义forward-output-iterators?
根据标准,forward_iterator只是一个input_iterator。因此,相应的forward_iterator_tag
仅展开input_iterator_tag
。如果我们使用std::iterator
来定义迭代器,我们使用什么标记作为正向输出迭代器?
定义一个扩展forward_iterator_tag
和output_iterator_tag
的私有标记或者是否有更好的解决方案是否正常?
答案 0 :(得分:6)
规范的事情是仅从std::iterator<std::forward_iterator_tag, T>
继承。迭代器只有一个类别。
标准没有用于输出迭代器的算法(或其他用途),输出迭代器也是前向迭代器。标准中输出迭代器的所有使用仅需要单次传递。
相反,该标准具有类别forward / bidi / randomaccess的可变与不可变迭代器的概念。所有需要通过迭代器编写的算法,以及需要比单次传递更好的算法,也会读取它们写入的相同迭代器。这是std::remove
,std::sort
和其他变异算法。
iterator标记未检测到mutable和immutable迭代器之间的区别,它取决于赋值表达式是否格式正确。因此,例如,如果将迭代器传递给不可变的std::sort
,那么算法无论如何都不会编译,因此通常也不需要使用output_iterator_tag
标记输入迭代器。所有需要OutputIterator
的算法都可以使用可变ForwardIterator
,同样不需要使用output_iterator_tag
进行标记。
如果您有不同于标准算法的需求,那么我无法立即想到您的提案不适合您的迭代器的原因。但它不会检测到可变的标准迭代器。例如,std::deque<int>::iterator
和int*
具有迭代器类别random_access_iterator_tag
,而不是您的私有标记,与output_iterator_tag
没有任何关系。因此,您最好定义自己的特征类,而不是希望调整现有的iterator_traits::iterator_category
来提供您想要的信息。