上一节我们学习了流迭代器,本节我们继续深入学习流对象的缓冲区迭代器——分别是istreambuf_iterator(从缓冲区读取字符)和ostreambuf_iterator(向缓冲区写入字符)。由于缓冲区读取数据要比流对象快,所以流缓冲区迭代器的操作效率要比流迭代器高。但在需要类型转换和数据验证的场景中,流迭代器提供了更好的安全性和便利性,读者需要明晰两者之间的区别。它们的使用方式十分“相似",让我们就通过代码的形式学习流对象的缓冲区迭代器吧:
#include<iostream>
#include<iterator>
#include<vector>
using namespace std;
void test()
{
/*ostreambuf_iterator char 类型*/
vector<int> v{1,2,3,4,5};
ostreambuf_iterator<char> out(cout);
cout << "vector内容: ";
for(int a : v)
{
string str = to_string(a) + " ";
for(char c : str) {
*out = c; // 逐个字符输出
}
}
cout << '\n';
/*istreambuf_iterator*/
v.clear();
cout << "请输入字符: ";
istreambuf_iterator<char> in(cin); // 只能读取 char
istreambuf_iterator<char> end;
vector<char> chars;
/*中断方式只能通过控制键来表示,EOF会被视为单个字符*/
/*windows-ctrl+Z+ENTER Linux/Mac-ctrl+D*/
while(in != end)
{
chars.push_back(*in);
++in;
}
cout << "输入了" << chars.size() << " 个字符: ";
for(char c : chars) {
cout << c;
}
cout << '\n';
}
int main(){
system("title dotcpp.com");
test();
return 0;
}编译结果如下:

可以看到输出完全符合我们的指令!
总结:流缓冲区迭代器与流对象迭代器十分”相似“,不过前者直接跳过格式化,直接操作二进制数据,效率比后者高出很多。同时,流缓冲区迭代器操作的的数据单位是字符,所以切勿使用其他数据类型比如string字符串等进行操作。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程