`istreambuf_iterator`和`istream_iterator`之间的区别

时间:2014-11-09 02:20:21

标签: c++

  1. istreambuf_iteratoristream_iterator之间有什么区别。

  2. 对于以下代码:

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

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

    istream_iterator<int>()
    

    是否与end相同?

  3. 所有记录在哪里?

1 个答案:

答案 0 :(得分:9)

  

istreambuf_iteratoristream_iterator之间有什么区别。

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

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}, {});
  

迭代器的终点指向哪里?

默认构造的流迭代器只是一个特殊的sentinel对象,表示流的结尾。由于IOStream是一次通过,所以在我们读到这一点之前,它没有办法实际指向结尾。在内部,当提取失败或读取命中文件结束时,使用流(或流缓冲区)构造的迭代器将更改为结束流迭代器。这有助于标准算法与流迭代器一起工作,因为它们就像外部的常规迭代器一样。

  

所有记录在哪里?

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