istreambuf_iterator和istream_iterator的区别是什么。
对于下面的代码:
istream_iterator<int> cin_in(cin);
istream_iterator<int> end;
迭代器end
指向哪里?
迭代器会绑定到流吗?
如果我编写代码:
istream_iterator<int>()
它和end
是一样的吗?
这一切都在哪里记录下来了?
istreambuf_iterator和istream_iterator的区别是什么。
对于下面的代码:
istream_iterator<int> cin_in(cin);
istream_iterator<int> end;
迭代器end
指向哪里?
迭代器会绑定到流吗?
如果我编写代码:
istream_iterator<int>()
它和end
是一样的吗?
这一切都在哪里记录下来了?
什么是
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}, {});
迭代器指向哪里?
默认构造的流迭代器只是一个特殊的哨兵对象,表示流的结尾。由于 IOStreams 是一次性的,直到我们读取到那个点为止,它实际上没有指向结尾的方式。在内部,当提取失败或读取到文件结尾时,使用流(或流缓冲区)构造的迭代器将变成一个结束流迭代器。这就是帮助标准算法使用流迭代器的原因,因为它们在外部像普通迭代器一样。
这都在哪里有文档记录?
很多地方。在标准中正式记录了。您还可以在 cppreference 找到文档。
end
称为 sentinel,它并不指向任何特定位置。 - Deduplicatorstd::vector<char> v((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>());
我不太理解第二个参数std::istreambuf_iterator<char>()
,它指向哪里? - Jessica Jin