是否需要ForwardIterators作为OutputIterators?我目前的STL实现(VS2012)从input_iterator_tag
和output_iterator_tag
中派生出forward_iterator_tag
,但我在标准[N3485]中找不到这个要求。正向迭代器是输出迭代器吗?
回答
在C++ 11中,不需要前向迭代器是输出迭代器。输出迭代器需求就像迭代器可以拥有的一组额外需求,而不管其满足的迭代器需求的其余部分。前向迭代只需要输入迭代器(§24.2.5/ 1):
一个类或指针类型X满足正向迭代如果满足要求:
- X满足的要求一个输入迭代
- ...
事实上,前向迭代符合输出迭代器的要求,只有当它是一个可变迭代到sequen可复制指定类型的文件夹†。
†或一个常量迭代器到一个类型序列,其中operator=(...) const
定义为可变成员。
更关键的是,迭代器标签是由标准为(§24.4.3/ 2)具体定义:
正如你可以看到,forward_iterator_tag
应该只从input_iterator_tag
继承。
在C++ 03,更说明正向迭代满足输入和输出的迭代器的要求:
正向迭代满足输入和输出迭代的所有要求,并且可以使用无论何时指定。
但这然后在下面的段落矛盾,指出一个不断前进的迭代器将不能满足输出迭代器的要求:
而且其类别,向前,双向或随机访问迭代器也可以是可变的或常量,取决于表达式* i的结果是作为参考还是作为常数的参考。常数迭代器不满足输出迭代器的要求,并且表达式* i(对于常量迭代器i)的结果不能用于需要左值的表达式中。
但是,迭代器标签的定义与C++ 11中的定义相同。有一个defect report这个矛盾的措辞,但它被关闭作为不是一个缺陷,因为第一个报价是在该部分的“介绍文本”,并可能在未来重写(它是)。
的SGI definition of a forward iterator被给定为输入和输出迭代的细化(感谢评价@BenVoigt)。
尽管如此,如果我们看看implementation of the iterator tags,我们发现forward_iterator_tag
仍然只从input_iterator_tag
继承。
看起来这已经相当多,在过去混乱的区域,但如果VS2012被定义为forward_iterator_tag
来自output_
继承 - 和input_iterator_tag
,我只能假设这是一个错误。
- 1. 输入迭代器+输出迭代器+ X =前向迭代器
- 2. 输出迭代器的VALUE_TYPE
- 3. 迭代器的迭代器
- 4. 迭代器只能迭代一次吗?
- 5. 向量迭代器
- 6. 分享迭代器是否可迭代?
- 7. 迭代器的类型:输出与输入与正向与随机访问迭代器
- 8. 通过python中的xmltree迭代器迭代时的空输出
- 9. 输入和输出迭代器
- 10. 定义正向输出迭代器的规范方法
- 11. C++ - 迭代器迭代器不编译
- 12. 异类迭代器的C++迭代器
- 13. Python迭代器:重置迭代器?
- 14. PHP迭代器像mysql迭代器?
- 15. 迭代器错误内的向量迭代器
- 16. 正向和当前迭代器
- 17. 输入迭代器和只读前向迭代器之间有什么区别?
- 18. 向量迭代器错误
- 19. QValueList逆向迭代器
- 20. JSP Struts反向迭代器
- 21. C++向量的迭代器
- 22. 双向迭代器Next
- 23. 向量迭代器比较
- 24. 无法复制到输出迭代器
- 25. 定义迭代器/迭代器构造函数时出错?
- 26. 在Rust中,是一个迭代器吗?
- 27. 迭代器postgreslql
- 28. 迭代器类
- 29. Java:迭代器
- 30. C++迭代器
但请注意,这似乎与SGI定义不同,文档中提到ForwardIterator是“InputIterator和OutputIterator的一种改进”,即存在ForwardInputIterator和ForwardOutputIterator,但不仅仅是ForwardIterator,这个概念不能单独存在。 –
@BenVoigt看来,这改变了C++ 03和C++ 11之间。编辑:等等,实际上,它很混乱。 –
@sftrabbit:感谢您解决这个问题。现在什么是将迭代器标记为向前和输出的规范方法? (简单地介绍一个新的私有标签,从两个继承,还是有不同的方式?) – MFH