输入迭代器可以重复读取而输出迭代器只能写入一次?

Input iterator can be read repeatedly while Output Iterator can only be written once?

我正在阅读 Bjarne Stroustrup 的 C++ 编程语言 第 4 版。在迭代器章节(第 31.1.2 章)中,它说:

Input iterator: We can iterate forward using ++ and read each element (repeatedly) using *.

Output iterator: We can iterate forward using ++ and write an element once only using *.

关于输入迭代器是只读一次还是重复读,我搜索了很多,例如: http://www.cplusplus.com/reference/iterator/InputIterator/ https://www.geeksforgeeks.org/input-iterators-in-cpp/

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

谢谢大家!

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

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

value = *inputIt;
value = *inputIt; // OK
copyIt = inputIt;
++inputIt;
value = *copyIt;  // Not OK

书上说输出迭代器确实有限制也是正确的:

 *outputIt = value;
  ++outputIt;
 *outputIt = value; // OK
 *outputIt = value; // Not OK

I always thought input and output iterator are completely opposite of each other.

许多输出迭代器也是输入迭代器,因此 "opposite" 描述性不强。它们是部分重叠的要求集。一个迭代器可以同时满足这两套要求。

If we have *outputIt = 1; then *outputIt = 2; aren't we just assigning to the same *outputit twice?

是;这是输出迭代器不需要支持的东西。

例如,考虑一个通过 Internet 发送数据包的输出迭代器。你已经写了一个数据包,它已经被发送到互联网并被其他机器接收。您无法回到过去并确定发送的数据包有所不同。您必须继续发送下一个数据包。

Bjarne 的话是正确的。如果你有一个输入迭代器,你可以根据需要多次执行 *iterator 。如果你有一个输出迭代器,你只能做 *iterator 一次。

它们的共同点是它们只能用于单通道算法。一旦你增加了一个输入或输出迭代器,那么到前一个位置的迭代器就不再需要是可解引用的

这意味着在

while (iterator != end)
{
    if (*iterator == some_value)
        something = *iterator;
    ++iterator;
}

iterator 必须是一个输入迭代器,因为我们每次迭代都会取消引用它两次。另一方面

while (iterator != end)
{
    something = *iterator;
    ++iterator;
}

适用于输入和输出迭代器,因为我们只进行一次解引用。

您可以根据需要多次读取输入迭代器。这来自“(void)*a, *a 等同于 *a”[input.iterators] 的要求,参见 table。

您只能通过输出迭代器写入一次。对于 *r = o、"After this operation r is not required to be dereferenceable"。 [output.iterators],参见 table。在你递增 r 之后你有一个新的迭代器,你可以再次通过它赋值一次。

一旦将这两个组合成一个 forward 迭代器,通过同一迭代器进行多次赋值的限制就会消失。