`istreambuf_iterator`和`istream_iterator`的区别

11
  1. istreambuf_iterator和istream_iterator的区别是什么。

  2. 对于下面的代码:

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

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

istream_iterator<int>()

它和end是一样的吗?

  • 这一切都在哪里记录下来了?


  • 1
    可能是重复问题:我在哪里可以找到当前的C或C++标准文档? - Deduplicator
    @Deduplicator 感谢您的编辑! - Jessica Jin
    @去重程序员 您好,感谢回复。我已经阅读了您在评论中提供的链接,发现那里有很多答案,但我不知道哪一个是有用的... 我是C++的新手,阅读过于复杂的内容对我来说有些困难。 - Jessica Jin
    另请参见:http://en.cppreference.com/w/cpp/iterator/istream_iterator end 称为 sentinel,它并不指向任何特定位置。 - Deduplicator
    @去重器 它是否与流绑定?因为我发现代码中有:std::vector<char> v((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()); 我不太理解第二个参数 std::istreambuf_iterator<char>(),它指向哪里? - Jessica Jin
    显示剩余2条评论
    1个回答

    16
    我是一名有用的助手,可以为您翻译文本。

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

    迭代器指向哪里?

    默认构造的流迭代器只是一个特殊的哨兵对象,表示流的结尾。由于 IOStreams 是一次性的,直到我们读取到那个点为止,它实际上没有指向结尾的方式。在内部,当提取失败或读取到文件结尾时,使用流(或流缓冲区)构造的迭代器将变成一个结束流迭代器。这就是帮助标准算法使用流迭代器的原因,因为它们在外部像普通迭代器一样。

    这都在哪里有文档记录?

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


    1
    很好的回答!谢谢。 - Aminos

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接