c++ - 输入迭代器可以重复读取,而输出迭代器只能写入一次?
问题描述
我正在阅读Bjarne Stroustrup的 The C++ Programming Language 4th edition。在迭代器章节(第 31.1.2 章)中,它说:
输入迭代器:我们可以使用 ++ 向前迭代并使用 *读取每个元素(重复)。
输出迭代器:我们可以使用 ++ 向前迭代,并且只使用 * 写入一个元素。
我对输入迭代器是否只能读取一次或重复进行了很多搜索,例如: http ://www.cplusplus.com/reference/iterator/InputIterator/ https://www.geeksforgeeks.org/input-iterators-在-cpp/
大多数人建议输入迭代器只能读取一次。但是为什么作者反复说输入迭代器呢?这个对吗?如果是这样,为什么输入迭代器可以重复读取,而输出迭代器只能写入一次。我一直认为输入和输出迭代器是完全相反的。
感谢大家!
解决方案
这本书是正确的;而矛盾的来源不是。似乎没有规则禁止通过输入迭代器间接读取对象多次。
其他来源可能会被另一个类似的限制混淆,即一旦输入迭代器增加,前一个迭代器的所有副本都将失效,因此可能不再被间接引用。此限制由输出迭代器共享。举例:
value = *inputIt;
value = *inputIt; // OK
copyIt = inputIt;
++inputIt;
value = *copyIt; // Not OK
这本书也是正确的,输出迭代器确实有限制:
*outputIt = value;
++outputIt;
*outputIt = value; // OK
*outputIt = value; // Not OK
我一直认为输入和输出迭代器是完全相反的。
许多输出迭代器也是输入迭代器,因此“相反”并不是非常具有描述性。它们是部分重叠的需求集。迭代器可以满足这两组要求。
如果我们有 *outputIt = 1; 然后 *outputIt = 2; 我们不是只是分配给同一个 *outputit 两次吗?
是的; 这就是输出迭代器不需要支持的东西。
例如,考虑一个通过 Internet 发送数据包的输出迭代器。您已经编写了一个数据包,它已被发送到互联网并被其他机器接收。您不能及时返回并确定发送的数据包是不同的。您必须继续下一个数据包并发送它。
推荐阅读
- bash - 如何在 bash 脚本中嵌入期望脚本,以便在期望脚本完成后我打开的 shell 不会关闭?
- flutter - 旋转时堆叠定位填充
- reactjs - Material ui 日期时间选择器主题
- r - 安装错误 R-package: CL/opencl.h: No such file or directory
- javascript - 使用 setInterval 的 Ajax 调用不会从数据库中获取新数据
- multithreading - Matlab 使用的计算能力
- java - Hibernate - OneToMany 单向映射 - SQLGrammarException
- node.js - 在数组中存储 WebSocket 消息时堆内存不足
- javascript - 每次Angular发生更改时如何更新现有组件?
- html - 我如何使侧边菜单在默认情况下为宽 pc 分辨率打开