输入迭代器 vs 输出迭代器 - 命名约定

5
我正在努力理解C++中的InputIterator和OutputIterator是什么。 我一直认为我所知道的Input和Output的定义也适用于迭代器,但现在看来事实并非如此。 Input意味着“放入某物”,意味着您可以向迭代器写入内容。 Output意味着“输出到某处”,通常意味着将内容写入屏幕或变量中。 然而,对于迭代器,InputIterator用于只读访问元素序列,这似乎应该被称为“Output”,因为您可以使用此类型的迭代器将std :: vector 的元素写入std :: cout等输出流。反之,OutputIterator是用于只写访问的。 我想知道是否有人能够合理地解释这种奇怪的迭代器类型命名?

请阅读C++03标准的§24.1.1和§24.1.2节。 - Nawaz
@Nawaz,好建议,但我没有标准的副本。 - Tony The Lion
发布标准是否违法? - Seth Carnegie
@Seth,据我所知是的,因为这通常是一份需要付费的文件。 - Tony The Lion
@Tony:拿一份草稿版本。 - jalf
1
我不明白迭代器在这里有什么不同。编程中我所见过的所有关于输入的引用都是指从外部数据源“输入”到程序中,而输出则是指从程序中“输出”数据。迭代器也是如此。 - Benjamin Lindley
2个回答

10
这只是一种惯例。 "输入"和"输出"是针对环境而不是针对程序的“从/到”的理解; 或者相反地,作为针对您的程序而不是环境的“进入/退出”。因此,“输入”从环境中获取某些内容,并使其可用于您的程序,例如istream或read。 "输出"将来自您的程序的内容放回环境中,例如ostream和write。迭代器遵循同样的方向,输入迭代器使范围内的数据可用于您的程序,而输出迭代器将来自您的程序的数据放入范围内。您可能认为“输入”是您的程序应该想要写入的“别人的”输入。但我想措辞假定了以自我为中心的程序员,他们自己的程序是参考点,而不是环境中的任何人(或每个人)。

1
这不应该是:“输入”和“输出”是相对于_您的程序_而言理解的,而不是相对于_环境_而言。 - ymett
@ymett:这取决于“with respect”是指“来自输入”还是“输入到”。 :-) - Kerrek SB
输入是进入您的程序的。输出是从您的程序中出来的。正如您所说,您的程序是参考点。 - ymett
@ymett:或者说:“输入来自环境,输出也返回给环境”……两种方式都可以。但你说得对,这与我的上一句话不一致。嗯,让我试着重新措辞一下。 - Kerrek SB
我没有表达清楚 - 我的意思是强调“内部”和“外部”(指位置而非方向),这只能指程序。 - ymett

5
一个输入迭代器是一个输入流的包装器。 一个输出迭代器是一个输出流的包装器。(当然,你可以编写其他的输入/输出迭代器,但这些都是标准中存在的示例,以 istream_iteratorostream_iterator 的形式存在。)
输入流是你从中读取的流(你获取了输入),因此,输入迭代器也是你可以从中获取输入的迭代器。
我同意,如果你只把它们看作迭代器,可能会有些难以理解。但当你记住它们通常包装一个流时,就更容易理解了。
例如,你可以在 std::cout 周围创建一个 ostream_iterator(它是一个输出迭代器)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接