上一节我们学习了流迭代器,本节我们继续深入学习流对象的缓冲区迭代器——分别是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字符串等进行操作。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)