流迭代器
流迭代器(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容器中,并成功输出这些数据。