【问题标题】:C++ stream iterators vs container iteratorsC++ 流迭代器与容器迭代器
【发布时间】:2014-09-01 03:05:58
【问题描述】:

据我了解,在 C++ 中,对于容器类型(例如 vectordequemap),我可以使用如下语法获取迭代器类型

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

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

stuff.begin()

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

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

据我了解,ifstream 没有任何方法 begin&lt;int&gt;beginbuf 我最初从 vector 的经验中所期望的方式。

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

【问题讨论】:

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

标签: c++ iterator


【解决方案1】:

我认为这里要注意的重要区别是您尝试使用迭代器的结构的差异。您提到的结构vectordequemap 是灵活的,但它们包含的数据的状态是相对静态的。另一方面,stream 是一种非常流动且不断变化的东西,如果我们按照stream 的方式看待它。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-28
      • 2013-02-07
      • 2019-03-26
      • 2010-10-27
      • 2016-10-22
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多