输入迭代器分类

MS *_*nth 13 c++

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

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

从他的书中引用:

输入迭代器可以读取序列中的元素.它们必须提供以下运算符 - equality(==),inequality(!=),dereference(*),postfix &prefix increment(++)和箭头operator(->).输入迭代器只能按顺序使用.我们保证 *it++有效,但增加输入迭代器可能会使该流上的所有其他迭代器无效.因此,无法保证我们可以保存输入迭代器的状态并通过保存的迭代器检查元素

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

Mad*_*ist 10

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

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

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

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


小智 4

一个例子可以说明这一点:

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

关于评论:

C++ 中使用迭代器的不同算法对迭代器有不同的要求。仅需要输入迭代器的算法,不需要该迭代器的任何先前状态。然而,前向、双向……迭代器满足输入迭代器的要求,并且可以在需要输入迭代器的算法中使用。