输入迭代器可以重复读取而输出迭代器只能写入一次?
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 迭代器,通过同一迭代器进行多次赋值的限制就会消失。
我正在阅读 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 迭代器,通过同一迭代器进行多次赋值的限制就会消失。