学科分类
目录
C++基础

流迭代器

流迭代器(stream iterator)也是STL中预定义迭代器适配器,流迭代器的思想是将输入输出流当作序列,用迭代器去遍历。STL提供了四个预定义的流迭代器:

● ostream_iterator:输出流迭代器,用于向ostream流写入数据;

● instream_iterator:输入流迭代器,用于从istream流读取数据;

● ostreambuf_iterator:输出流缓冲区迭代器,用于向流缓冲区写入数据;

● istreambuf_iterator:输入流缓冲区迭代器,用于从流缓冲区读取数据;

在使用中,ostream_iterator与istream_iterator较为常用,因此接下来我们分别来讲解一下这两个

迭代器。

1、输出流迭代器

输出流迭代器用于向流中写入数据,它是利用“<<”操作符将指定类型的数据写入到流中,流对象是在构造输出流迭代器时指定,输出流迭代器构造函数有以下两种形式,如下所示:

ostream_iterator(ostream& out);
ostream_iterator(ostream& out, const char* delimiter);

​ 参数out指将数据输出到的输出流,第二种形式中的delimiter参数表示两个输出数据之间的分隔符,该参数是可选的。

输出流迭代器是典型的输出迭代器,它具备输出迭代器的所有功能,在算法中使用输出流迭代器时,可以直接访问输出流,如例8-10中的第14行代码:

copy(d1.begin(), d1.end(), ostream_iterator<int>(cout, " "));

copy()的第三个参数是创建一个输出int类型数据的输出流迭代器,将数据输出到cout流中,以空格为分隔符,因此此次copy()函数的调用就是将[d1.begin(), d1.end)区间的数据用输出流迭代器输出到屏幕。

2、输入流迭代器

输入流迭代器用于从流中读取数据,它是利用“>>”操作符将指定类型的数据从流中读出,流对象是在构造输入流迭代器时指定,输入流迭代器构造函数如下所示:

istream_iterator(istream& in);

参数in指要从中读取数据的流。输入流迭代器是典型的输入迭代器,它支持输入迭代器的所有操作。

输入流迭代器与输出流迭代器不同,从流中读取数据可能会读取失败,或者流区间已经到达终点,为了解决这个问题,istream_iterator类模板提供了一个默认构造函数,用默认构造函数生成的迭代器,指向的是输入流的结束位置。所以在每次读取时可以用输入流迭代器与此迭代器作比较,以判断是否可以进行读取操作。

为了让读者更深刻的理解流迭代器的使用,接下来我们通过一个案例来演示流迭代器的用法,具体如例1所示。

例1

 1    #include <iostream>
 2    #include <deque>
 3    #include <algorithm>
 4    #include <iterator>
 5    using namespace std;
 6    int main()
 7    {
 8         cout << "please input data:" << endl;
 9        deque<int> d;  //创建一个deque<int>容器d
 10        istream_iterator<int> it(cin); //定义一个输入流迭代器,从cin流中读取数据
 11        istream_iterator<int> itf; //默认输入流迭代器
 12        while (it != itf) //比较it与itf迭代器,判断读取操作是否合法
 13        {
 14            *it; //相当于cin>>
 15            d.push_back(*it); //将读取到的数据存储到d容器中
 16            ++it; //迭代器向后移动
 17        }
 18         // 用输出流迭代器输出容器中数据
 19        copy(d.begin(), d.end(), ostream_iterator<int>(cout, " ")); 
 20        cout << endl; 
 21        system("pause");
 22        return 0;
 23    }

运行结果如图1所示。

图1 例1运行结果

在例1中,第9行代码创建了一个deque<int>容器,第10行代码定义一个输入流迭代器it,从cin流对象中读取数据,第11行代码定义了一个默认输入流迭代器itf,第12-17行代码利用while()循环输入流迭代器it从流中读取数据,读取条件是没有到达流末尾,然后将读取到的数据插入到d容器中。第18行代码是用输出流迭代器输出容器中数据,由图1可知,从cin流对象中成功读取数据并存储到d容器中,并成功输出这些数据。

点击此处
隐藏目录