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

MFH*_*MFH 7 c++ iterator-traits c++11

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

根据标准,forward_iterator只是一个input_iterator.所以相应的forward_iterator_tag只是延伸input_iterator_tag.如果我们std::iterator用来定义迭代器,我们使用什么标签作为正向输出迭代器?

定义扩展两者的私有标记是否规范forward_iterator_tag,output_iterator_tag或者是否有更好的解决方案?

Ste*_*sop 6

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

该标准没有输出迭代器的算法(或其他用途),也是一个前向迭代器.标准中输出迭代器的所有使用仅需要单次通过.

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

迭代器标记未检测到可变迭代器和不可变迭代器之间的区别,它取决于赋值表达式是否格式正确.因此,例如,如果将迭代器传递给std::sort不可变的,那么算法无论如何都不会编译,因此通常也不需要输入迭代器来标记output_iterator_tag.所有需要一个OutputIterator遗嘱的算法Just Work with a mutable ForwardIterator,再次没有必要对它进行标记output_iterator_tag.

如果您有不同于标准算法的需求,那么我无法立即想到您的提案不适合您的迭代器的原因.但它不会检测到可变的标准迭代器.例如,std::deque<int>::iterator并且int*具有迭代器类别random_access_iterator_tag,而不是您的私有标记,而不是与其有关output_iterator_tag.所以你可能最好定义自己的traits类,而不是希望调整现有的类iterator_traits::iterator_category来提供你想要的信息.