STL 中的流缓冲区迭代器可以细分为输入流缓冲区迭代器和输出流缓冲区迭代器,输入流缓冲区迭代器(istreambuf_iterator)也就是从输入流缓冲区中读取字符元素;输出流缓冲区迭代器(ostreambuf_iterator)也就是将连续的字符元素写入到输出缓冲区中。
流缓冲区迭代器和流迭代器最大的区别在于,前者仅仅会将元素以字符的形式(包括 char、wchar_t、char16_t 及 char32_t 等)读或者写到流缓冲区中,由于不会涉及数据类型的转换,读写数据的速度比后者要快。
#include <iterator> using namespace std;
说明
istreambuf_iterator 的模板类定义在
<iterator>
头文件,并位于 std 命名空间中。技术细节
istreambuf_iterator 输入流缓冲区迭代器的功能是从指定的流缓冲区中读取字符元素。该类型迭代器本质是一个输入迭代器,即假设 p 是一个输入流迭代器,则其只能进行
++p
、p++
、*p
操作,同时迭代器之间也只能使用 == 和 != 运算符。创建istreambuf_iterator
语法一
std::istreambuf_iterator<char> end_in;
通过调用 istreambuf_iterator 模板类中的默认构造函数,可以创建一个表示结尾的输入流缓冲区迭代器。要知道,当我们从流缓冲区中不断读取数据时,总有读取完成的那一刻,这一刻就可以用此方式构建的流缓冲区迭代器表示。
语法二
std::istreambuf_iterator<char> in{ std::cin };
我们还可以指定要读取的流缓冲区。
案例
使用istreambuf_iterator
使用 istreambuf_iterator
#include <iostream> #include <iterator> #include <string> using namespace std; int main() { cout << "嗨客网(www.haicoder.net)\n" << endl; istreambuf_iterator<char> eos; istreambuf_iterator<char> iit(cin); string mystring; cout << "向缓冲区输入元素:\n"; while (iit != eos) { mystring += *iit++; } cout << "string:" << mystring; cout << endl; return 0; }
我们在 Linux 下使用 g++ 进行编译,具体命令如下: