istreambuf_iterator
和istream_iterator
之间有什么区别。
对于以下代码:
istream_iterator<int> cin_in(cin);
istream_iterator<int> end;
迭代器end
指向哪里?
迭代器是否会与流绑定?
如果我写代码
istream_iterator<int>()
是否与end
相同?
所有记录在哪里?
答案 0 :(得分:9)
istreambuf_iterator
和istream_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找到文档。