首页 > 解决方案 > 输入迭代器可以重复读取,而输出迭代器只能写入一次?

问题描述

我正在阅读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/

大多数人建议输入迭代器只能读取一次。但是为什么作者反复说输入迭代器呢?这个对吗?如果是这样,为什么输入迭代器可以重复读取,而输出迭代器只能写入一次。我一直认为输入和输出迭代器是完全相反的。

感谢大家!

标签: c++c++11iteratorinput-iterator

解决方案


这本书是正确的;而矛盾的来源不是。似乎没有规则禁止通过输入迭代器间接读取对象多次。

其他来源可能会被另一个类似的限制混淆,即一旦输入迭代器增加,前一个迭代器的所有副本都将失效,因此可能不再被间接引用。此限制由输出迭代器共享。举例:

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 发送数据包的输出迭代器。您已经编写了一个数据包,它已被发送到互联网并被其他机器接收。您不能及时返回并确定发送的数据包是不同的。您必须继续下一个数据包并发送它。


推荐阅读