【问题标题】:the difference betwen `istreambuf_iterator` and `istream_iterator``istreambuf_iterator` 和 `istream_iterator` 之间的区别
【发布时间】:2015-01-05 14:30:41
【问题描述】:
  1. istreambuf_iteratoristream_iterator 有什么区别。

  2. 对于以下代码:

     istream_iterator<int> cin_in(cin);
     istream_iterator<int> end; 
    

    迭代器end指向哪里?
    迭代器会与流绑定吗?
    如果我写代码

    istream_iterator<int>()
    

    end一样吗?

  3. 所有记录在哪里?

【问题讨论】:

  • @Deduplicator 感谢编辑!
  • @Deduplicator 嗨,感谢您的回复。我已阅读您在评论中包含的链接,我发现那里有很多答案,我不知道哪一个有帮助...我是一个新的 C++,我有点难以阅读太复杂的东西..
  • 另见:en.cppreference.com/w/cpp/iterator/istream_iterator end 被称为哨兵,它并不指向任何特定的地方。
  • @Deduplicator 是否与流绑定?因为我找到了代码:std::vector&lt;char&gt; v( (std::istreambuf_iterator&lt;char&gt;(in)), std::istreambuf_iterator&lt;char&gt;() );我不太明白第二个参数std::istreambuf_iterator&lt;char&gt;(),它指向哪里?

标签: c++


【解决方案1】:

istreambuf_iteratoristream_iterator 有什么区别。

std::istream_iterator 是用于格式化提取的迭代器。例如,如果您从文件中有一行整数并希望将它们复制到某个容器中,您可以使用std::istream_iterator&lt;int&gt;,它会在内部将从int(使用operator&gt;&gt;())中提取的值复制到容器中:

std::copy(std::istream_iterator<int>(file),
          std::istream_iterator<int>(), std::back_inserter(some_container));

std::istreambuf_iterator 是一个用于无格式提取的迭代器。它直接作用于通过其构造函数提供的std::streambuf 对象。因此,如果您只需要文件的内容而不担心其格式,请使用此迭代器。例如,有时您想将整个文件读入字符串或某个容器中。常规格式的提取器将丢弃前导空格并转换提取的标记;缓冲区迭代器不会:

std::string str(std::istreambuf_iterator<char>{file}, {});

迭代器的端点指向哪里?

默认构造的流迭代器只是一个特殊的标记对象,它表示流的结束。因为 IOStreams 是一次性的,所以在我们读完之前没有办法让它真正指向结尾。在内部,当提取失败或读取到达文件末尾时,使用流(或流缓冲区)构造的迭代器将变为结束流迭代器。这有助于标准算法与流迭代器一起工作,因为它们在外部表现得像常规迭代器。

所有记录在哪里?

很多地方。正式在标准中。您还可以在 cppreference 上找到文档。

【讨论】:

  • 不错的答案!谢谢
猜你喜欢
  • 2012-05-20
  • 1970-01-01
  • 2021-12-25
  • 2020-05-10
  • 2014-09-20
  • 2010-10-28
  • 2015-10-04
  • 2012-08-12
  • 2011-02-18
相关资源
最近更新 更多