输入迭代器和只读前向迭代器之间有什么区别?

时间:2012-01-15 10:45:23

标签: c++ iterator c++-standard-library

输入迭代器和只读前向迭代器有什么区别?

因为后者是只读的,所以它们显然不满足输出迭代器的要求。而且,正因为如此,它们才能有效地输入迭代器并提供额外的保证(如果有的话)。问题是,有什么额外保证?

我的猜测是前向迭代器是多遍的,输入迭代器不是,我是对的吗?

1 个答案:

答案 0 :(得分:21)

是的,输入迭代器是一次通过迭代器。你只能迭代它们一次,而前向迭代器是多遍的。

来自§24.2.3 [input.iterators] p2 (the table)++r的前/后条件列:

  

pre:r是可解除引用的   帖子:r可以取消引用或r是过去的结尾   发布:不再需要将r之前值的任何副本设置为可解除引用或位于==的域中。

最后一个后置条件意味着对于a == b++a == ++b不一定是true
同一条,第3款:

  

[注意:对于输入迭代器, a == b 并不意味着 ++ a == ++ b 。 (Equality不保证替换属性或引用透明性。)输入迭代器上的算法绝不应该尝试两次通过相同的迭代器。它们应该是单通算法。 [...]这些算法可以通过istream_iterator类模板与istream一起用作输入数据的来源。 -end note ]

来自§24.2.5 [forward.iterators]

  

p1类或指针类型X满足前向迭代器的要求

     
      
  • [...]
  •   
  • X类型的对象提供多次通过保证,如下所述。
  •   
     

p3如果符合以下条件,则X类型的两个可解除引用的迭代器a和b提供多次通过保证

     
      
  • a == b隐含++a == ++b
  •   
  • X是指针类型,或者表达式(void)++X(a), *a等同于表达式*a
  •