为什么InputIterator只能通过一次
Why are InputIterators one pass only?
来自
24.2.3输入迭代器[Input.iterators]
3( […]输入迭代器上的算法永远不应该尝试通过通过同一迭代器两次。它们应该是单程算法。[…]
这个IMO限制了一些相当直接的优化(比如遍历容器一次,看看它有多少元素(——唉,动机不在问题的范围内。
为什么要这样做?
输入迭代器用于对没有实质实现的范围进行迭代(id表示它们的元素实际上不存在于内存中的某个位置(,如网络流中的字节或/dev/random中的随机数序列。考虑最后一个例子:一旦消耗了第一个随机数,就没有办法再次检索它。
另一方面,前向迭代器提供对范围的访问,这些范围要么有实质性的实现(假设它们的所有元素实际上都存在于内存中的某个位置(,要么可以很容易地重新计算†。从本质上讲,容器通常提供前向迭代器:容器本身就是范围的具体化。
用输入迭代器定义的范围有时可以转换为用前向迭代器来定义的范围,只需将其具体化:只需使用单程将整个范围复制到一个容器中,然后在该容器上随意迭代。显然,这并非在所有情况下都是可取的,有时甚至不可能:有些范围,如/dev/random中的字节,是无限的,永远无法完全实现。
如果一个算法可以一次性编写,那么就没有理由禁止它与输入迭代器一起使用。然而,没有什么可以阻止这样的算法使用优化版本,该版本在给定正向或更好的迭代器时执行多次传递。
&匕首;例如,所有偶数的范围不需要在容器中实现所有数字,但可以很容易地从给定的迭代器重新开始,因为重新计算数字既可能又便宜。
选择的名称已经提示了原因:将迭代器视为在输入流上迭代,如键盘输入或网络流。无法对流进行两次迭代,因此存在限制。
在需要优化的情况下,我们不介意提高迭代器的要求,前向迭代器或更强大的迭代器是自然的选择。
相关问题:What';输入迭代器和只读前向迭代器之间的区别是什么?
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何仅使用一次固定<<设置精度(2)?或者至少恢复到默认行为?
- 什么是仅调用一次并调用参数的控制台应用
- 如何确保用户在一行上提示输入一次时输入名字和姓氏?
- (C++)虽然循环一次不起作用,但我引入了多个变量
- 为什么我的信号处理程序只执行一次?
- 如何使用C++一次读取整个二进制文件
- 花括号使循环运行一次?
- 从子菜单返回后,正确的输入至少进入验证循环一次
- 为什么InputIterator只能通过一次