2014-09-01 93 views
1

据我了解,在C++中,集装箱类型(例如vectordequemap),我可以使用语法迭代器型像C++流迭代器VS容器迭代器

vector<int>::iterator 
map<int,int>::const_iterator 

,并得到一个实际的迭代器通过一个方法等

stuff.begin() 

然而第一元件,用于流(例如ifstream),界面似乎有点不同;我可以通过写

streambuf_iterator<char>(fin) 
stream_iterator<int>(fin) 

从我的理解得到一个迭代器,ifstream没有任何方法begin<int>beginbuf我最初我与vector经验预期的方式。

他们有什么不同(技术或历史)的原因是什么?如果istream迭代器的行为更像vector之类,那么对于新的编码器来说,它会更加正交吗?

+3

它主要是历史 - 在迭代器进入图片之前,iostreams已经使用了好几年了。还有一个实际问题:一个矢量是通过一个类型实例化的,所以它成为迭代器的类型。对于流,您需要直接指定您的计划的读/写类型,因为流可以保存任意类型的对象。 – 2014-09-01 03:14:29

回答

0

我认为这里需要注意的重要区别是您尝试使用迭代器的结构的差异。你提到的结构,vectordequemap,是灵活的,但它们包含的数据的状态是相对静态的。另一方面,如果我们把它看作stream应该是的话,那么stream是非常流畅和不断变化的东西。

现在,因为数据流“流动”并继续变化,所以当将数据流视为数据对象时,不会有流向beginend。显然,这个观点并不是绝对的,但我相信这将是设计stream迭代器时遵循的理念。

0

实际上流是没有向量的。你可以想象一条河流。一条河没有“开始”水,也没有“结束”水(除非干涸)。矢量更多的是一排相同的物体。该行开始和结束。

一个文件当然有一个开始和结束,但这不是流想要将文件抽象出来的方式。