我正在阅读Stanley Lippman的C ++ Primer一书,以了解有关C ++ 11的更多信息。
在关于通用算法的章节中,他提到泛型算法中使用的迭代器可以根据它们支持的操作分为5种类型:输入迭代器,输出迭代器,前向迭代器,双向迭代器和随机访问迭代器。
引用他的书:
输入迭代器可以读取序列中的元素。他们必须提供 跟随运算符 - 相等(
==
),不等式(!=
),解除引用(*
), postfix&
前缀增量(++
)和箭头运算符(->
)。输入 迭代器只能按顺序使用。 我们保证*it++
有效,但递增输入迭代器可能会使该流上的所有其他迭代器无效。因此,无法保证 我们可以保存输入迭代器的状态并检查一个元素 通过保存的迭代器
我无法用粗体理解这句话。为什么递增一个仅用于读取元素的输入迭代器会使其他迭代器无效?为什么我们不能保存输入迭代器的状态?
答案 0 :(得分:10)
输入迭代器可以引用任何对输入流建模的内容,包括:
虽然在某些情况下可以保存输入流的状态,但通常是不可能的(文件可能已经更改或已被删除,人类忘记了他输入的内容,网络连接也没有记忆)。因此,您无法保存输入迭代器。
为了允许不同的可能实现和优化(例如缓冲),标准允许输入迭代器使该流的所有其他迭代器无效。
答案 1 :(得分:4)
一个例子可以说明一下:
假设您有一个带有(微小)内部缓冲区的流和一个引用该缓冲区的输入迭代器。如果递增输入迭代器,则只要流缓冲区获得新内容(下溢),所有保存的输入迭代器(引用该缓冲区)将变为无效。
关于评论:
使用迭代器的C ++中的不同算法对迭代器有不同的要求。一个只需要输入迭代器的算法,不需要该迭代器的任何先前状态。但是,正向,双向,...,迭代器满足输入迭代器的要求,可用于需要输入迭代器的算法。
答案 2 :(得分:4)
通常,输入迭代器中没有底层容器
记忆。经典的例子是std::istream_iterator
。
当你递增其中一个迭代器时,你实际上是进入的
底层外部序列(文件),这意味着
该序列上的其他迭代器也被修改。