C++流迭代器与容器迭代器

C++ stream iterators vs container iterators

本文关键字:迭代器 C++      更新时间:2023-10-16

据我所知,C++,对于容器类型(例如 vectordequemap(,我可以使用类似语法获取迭代器类型

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

并通过类似这样的方法获取第一个元素的实际迭代器

stuff.begin()

但是,对于流(例如 ifstream(,界面似乎有点不同;我可以通过编写来获得迭代器

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

据我了解,ifstream没有任何方法begin<int>beginbuf我最初从vector经验中期望的方式。

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

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

现在,由于流"流动"并继续变化,因此在将流作为数据对象观察时,流没有beginend。显然,这种观点不是绝对的,但我相信这将是设计迭代器时遵循stream理念。

事实上,流不是向量。你可以想象一条河。河流没有"开始"的水,也没有"结束"的水(除非它干涸了(。向量更像是一排相同的对象。该行有开始和结束。

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