13.5.5 流迭代器
流迭代器是一种特殊的迭代器,它包括istream_iterator和ostream_iterator,需要理解的要点是将输入/输出流看做容器。因此,任何接受迭代器参数的算法都可以和流一起工作。使用流迭代器必须要包含头文件<iterator>。
1.输出流迭代器
对输出流来说,STL提供了ostream_iterator模板,其定义的基本格式如下所示。
ostream_iterator<class typename1,class typename2=char>迭代器名(ostream_type&ost,const typename2*p=0);例如下述代码所示。 ostream_iterator<int,char>it(cout,"\n");
it现在是个输出流迭代器,通过it可使用cout输出信息,typename1(这里为int)指出发送给输出流的数据类型,typename2(这里是char)指出输出流要使用的字符类型,char是默认值,构造函数第1个参数ost指出了要使用的输出流,其可以是文件输出流,见第14章的内容。因此,流迭代器可用于文件的读写,最后1个参数,即typename2类型指针p指向发送给输出流的每个typename数据后显示的分隔符。
输出流迭代器的示例如代码13.14所示。
代码13.14 输出流迭代器的用法OstreamIterator
<———————————-文件名:example1314.cpp———————————————> 01 #include<iostream> 02 #include<iterator> 03 #include<algorithm> 04 #include<vector> 05 using namespace std; 06 int main() 07 { 08 int sz[6]={1,2,3,4,5,6}; 09 vector<int>ob(sz,sz+6);//创建vector<int>容器ob 10 ostream_iterator<int,char>osi(cout,"");//创建输出流迭代器osi 11 copy(ob. begin(),ob.end(),osi);//将ob复制到流中 12 cout<<endl; 13 return 0; 14 }
输出结果如下所示。
1 2 3 4 5 6
【代码解析】代码第11行使用了泛型算法copy,关于泛型算法的介绍请参考下一节的内容,copy共有3个迭代器参数,前两个表示要复制的范围,第3个表示将第1个元素复制到什么位置,本例理解的关键在于将输出流理解为一个容器,与普通容器的不同之处在于其中的元素都会被自动输出,且输出的元素间有特定的分割符。
2.输入流迭代器
对输入流来说,STL提供了istream_iterator模板,其定义格式如下所示。
istream_iterator<class typename1,class typename2=char>迭代器名(istream_type&ist);
输入流迭代器同样有两个模板参数,typename1指出要读取的数据类型,typename2指出输入流使用的字符类型,默认为char,构造函数只有一个参数,ist指明了要使用的输入流,既可以是常用的cin,又可以是文件输入流。
输入流迭代器的具体用法,如代码13.15所示
代码13.15 输入流迭代器的用法IstreamIterator
<——————————文件名:example1315.cpp————————————————-> 01 #include<iostream> 02 #include<iterator> 03 #include<algorithm> 04 #include<vector> 05 using namespace std; 06 int main() 07 { 08 vector<int>ob;//创建vector<int>容器ob 09 istream_iterator<int,char>isi(cin);//创建输入流迭代器osi 10 copy(isi,istream_iterator<int,char>(),back_inserter(ob));//将输入流插入到ob中 11 for(vector<int>:iterator it=ob. begin();it!=ob.end();it++)//遍历输出ob中的元素 12 { 13 cout<<(*it)<<""; 14 } 15 cout<<endl; 16 return 0; 17 }
输出结果如下所示。
1 5 9 7 8(用户输入) 2 6 4(用户输入) h(用户输入) 1 5 9 7 8 2 6 4
【代码解析】代码第10行的copy函数的起始位置分别是输入流迭代器isi和省略了构造函数的匿名输入迭代器istream_iterator<int,char>(),代表输入失败,因此,copy语句用于从输入流中提取int型数据并将其插入ob的后部,直到类型不匹配或出现其他故障,所以,当用户输入h时,copy操作停止,程序对ob进行遍历输出。
back_inserter是另外一种迭代器适配器,迭代器适配器的相关内容稍后会详细介绍。