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