C++;流迭代器与容器迭代器 从我理解的,在C++中,对于容器类型(例如,代码>向量< /代码>, DEQu< /COD>, MAP< /COD>),可以使用类似于的语法获得迭代器类型。 vector<int>::iterator map<int,int>::const_iterator

C++;流迭代器与容器迭代器 从我理解的,在C++中,对于容器类型(例如,代码>向量< /代码>, DEQu< /COD>, MAP< /COD>),可以使用类似于的语法获得迭代器类型。 vector<int>::iterator map<int,int>::const_iterator,c++,iterator,C++,Iterator,然而,对于流(例如,ifstream),接口似乎有点不同;我可以通过写一个迭代器 streambuf_iterator<char>(fin) stream_iterator<int>(fin) streambuf_迭代器(fin) 流迭代器(fin) 据我所知,ifstream没有任何方法begin或beginbuf我最初从vector的经验中所期望的方法 它们不同(技术或历史)有什么原因吗?如果istream迭代器的行为更像vector及其同类,那么对于新的程序员来

然而,对于流(例如,
ifstream
),接口似乎有点不同;我可以通过写一个迭代器

streambuf_iterator<char>(fin)
stream_iterator<int>(fin)
streambuf_迭代器(fin)
流迭代器(fin)
据我所知,
ifstream
没有任何方法
begin
beginbuf
我最初从
vector
的经验中所期望的方法


它们不同(技术或历史)有什么原因吗?如果
istream
迭代器的行为更像
vector
及其同类,那么对于新的程序员来说,这不是更正交、更容易吗?

我认为这里要注意的重要区别是您尝试使用迭代器的结构的不同。您提到的结构,
vector
deque
map
,是灵活的,但它们所包含的数据的状态是相对静态的。另一方面,
是非常流动和不断变化的东西,如果我们把它看作
应该是这样的话


现在,由于流“流动”并继续变化,当将其作为数据对象观察时,流没有
begin
end
。显然,这种观点不是绝对的,但我相信这将是设计
迭代器时遵循的理想方法。

事实上,流不是向量。你可以想象一条河。河流没有“起点”水,也没有“终点”水(除非干涸)。向量更像是一行相同的对象。那一行有开始也有结束

文件当然有开始和结束,但这不是流希望您抽象文件的方式。

它主要是历史性的——在迭代器出现之前,iostreams已经使用多年了。还有一个实际问题:一个向量在一个类型上实例化,因此它成为迭代器的类型。对于流,您需要直接指定计划读/写的类型,因为流可以容纳任意类型的对象。
streambuf_iterator<char>(fin)
stream_iterator<int>(fin)