输入迭代器分类

时间:2014-04-03 10:39:32

标签: c++

我正在阅读Stanley Lippman的C ++ Primer一书,以了解有关C ++ 11的更多信息。

在关于通用算法的章节中,他提到泛型算法中使用的迭代器可以根据它们支持的操作分为5种类型:输入迭代器,输出迭代器,前向迭代器,双向迭代器和随机访问迭代器。

引用他的书:

  

输入迭代器可以读取序列中的元素。他们必须提供   跟随运算符 - 相等(==),不等式(!=),解除引用(*),   postfix &前缀增量(++)和箭头运算符(->)。输入   迭代器只能按顺序使用。 我们保证   *it++有效,但递增输入迭代器可能会使该流上的所有其他迭代器无效。因此,无法保证   我们可以保存输入迭代器的状态并检查一个元素   通过保存的迭代器

我无法用粗体理解这句话。为什么递增一个仅用于读取元素的输入迭代器会使其他迭代器无效?为什么我们不能保存输入迭代器的状态?

3 个答案:

答案 0 :(得分:10)

输入迭代器可以引用任何对输入流建模的内容,包括:

  • 物理光盘上的文件
  • 人类在键盘上打字
  • 通过网络连接发送的字节

虽然在某些情况下可以保存输入流的状态,但通常是不可能的(文件可能已经更改或已被删除,人类忘记了他输入的内容,网络连接也没有记忆)。因此,您无法保存输入迭代器。

为了允许不同的可能实现和优化(例如缓冲),标准允许输入迭代器使该流的所有其他迭代器无效。

答案 1 :(得分:4)

一个例子可以说明一下:

假设您有一个带有(微小)内部缓冲区的流和一个引用该缓冲区的输入迭代器。如果递增输入迭代器,则只要流缓冲区获得新内容(下溢),所有保存的输入迭代器(引用该缓冲区)将变为无效。

关于评论:

使用迭代器的C ++中的不同算法对迭代器有不同的要求。一个只需要输入迭代器的算法,不需要该迭代器的任何先前状态。但是,正向,双向,...,迭代器满足输入迭代器的要求,可用于需要输入迭代器的算法。

答案 2 :(得分:4)

通常,输入迭代器中没有底层容器 记忆。经典的例子是std::istream_iterator。 当你递增其中一个迭代器时,你实际上是进入的 底层外部序列(文件),这意味着 该序列上的其他迭代器也被修改。

相关问题