这
3)[...]输入迭代器的算法绝不应该尝试传递 通过相同的迭代器两次。它们应该是单通道算法。 [...]
这个IMO限制了一些相当直接的优化(例如通过容器一次以查看它有多少元素) - 唉,动机超出了问题的范围。
为什么要这个?
答案 0 :(得分:8)
输入迭代器用于迭代没有物质实现的范围(id,它们的元素实际上并不存在于内存中),例如来自网络流的字节,或来自/ dev /的随机数序列随机。考虑最后一个例子:一旦你消耗了第一个随机数,就无法再次检索它。
另一方面,转发迭代器提供对具有材料实现的范围的访问(id est所有元素实际存在于内存中的某处)或者可以轻松地重新计算†。就其本质而言,容器通常提供前向迭代器:容器本身就是范围的实现。使用输入迭代器定义的范围有时可以转换为使用前向迭代器定义的范围,只需实现它:只需使用单个传递将整个范围复制到容器中,然后根据需要迭代该容器。显然这在所有情况下都不可取,有时甚至不可能:某些范围,如/ dev / random中的字节,是无限的,永远不能完全实现。
如果算法可以一次写入,则没有理由禁止它与输入迭代器一起使用。但是,当给定前向或更好的迭代器时,没有任何禁止这样的算法使用执行多次传递的优化版本。
†例如,所有偶数的范围不需要实现容器中的所有数字,但是可以从给定的迭代器中轻松地重新开始,因为重新计算数字是可能且便宜的。
答案 1 :(得分:4)
选择的名称已经提示了为什么:将迭代器视为迭代输入流,例如键盘输入或网络流。没有办法迭代两次流,因此限制。
在需要优化的情况下,我们不介意提高迭代器的要求,forward iterator或更强大的东西是自然选择。
相关问题:What's the difference between input iterators and read-only forward iterators?