STL与泛型编程<十二>:Stream(流)迭代器

来源:互联网 发布:成都犀牛软件培训 编辑:程序博客网 时间:2024/04/30 11:49

ostream_iterator

ostream迭代器可以将赋的值写入output stream中,它的实作机制与insert迭代器概念一致,唯一的区别在于ostream迭代器将赋值操作转换为operator<<,ostream迭代器的各个操作函数如下
这里写图片描述
其定义如下

namespace std{    template<typename T, typename charT = char, typename traits = char_traits<charT> >    class ostream_iterator;}

例子如下

#include <iostream>#include <vector>#include <algorithm>#include <iterator>using namespace std;int main(void){    ostream_iterator<int> intWriter(cout,"\n");    *intWriter = 42;  //42    intWriter++;    //并没有什么用    *intWriter = 77; //77    intWriter++;    //并没有什么用    *intWriter = -5; // -5    vector<int> col;    for (int i=1; i<=9; ++i)        col.push_back(i);    copy(col.begin(),col.end(),ostream_iterator<int>(cout)); // 123456789    cout << endl;    copy(col.begin(),col.end(),ostream_iterator<int>(cout,"<"));//1<2<3<4<5<6<7<8<9    cout << endl;    return 0; } 

注意
1. 输出迭代器的分隔符是const char*的,因此如果你传一个string对象进去,别忘了用c_str()成员函数以获得正确的型别,如下

string delim;...ostream_iterator<int>(cout,delim.c_str());
  1. ostream_iterator不提供超出末端迭代器

istream_iterator

istream迭代器用来从input stream迭代器读取元素,透过istream迭代器,算法可以从stream迭代器中直接读取数据。运用此迭代器读取元素,你需要知道区间是否已经到达终点或读取错误,为了解决这个问题,可以用end-of-stream迭代器,它可以利用istream迭代器的default构造函数生成。先看看定义

namespace std{    template<typename T, typename charT = char, typename traits = char_traits<charT>, typename Distance = ptrdiff_t>    class istream_iterator;}

其各项操作见下图
这里写图片描述
如果满足以下条件,我们便说两个istream迭代器相等
1. 两者都是end-of-stream迭代器(因而不能再进行读操作),或
2. 两者都可以再进行读操作,并指向相同的stream

以下是应用例子

#include <iostream>#include <iterator>using namespace std;int main(void){    istream_iterator<int> intReader(cin);    istream_iterator<int> intReaderEOF;    while (intReader != intReaderEOF)    //while (intReader != istream_iterator<int>())或这样写    {        cout << "once : " << *intReader << endl;        cout << "once again: " << *intReader << endl;        ++intReader;    }    return 0; } /* 输入:1 2 3 f 4 输出:1 1 2 2 3 3 */

字符f的输入导致程序结束,由于格式错误,stream不再处于good状态,就和end-of-stream迭代器intReaderEOF相同,进而结束循环。

再看一个例子

#include <iostream>#include <iterator>#include <string>using namespace std;int main(void){    istream_iterator<string> cinPos(cin);    ostream_iterator<string> coutPos(cout," ");    while (cinPos != istream_iterator<string>())  //istream_iterator<string>()会产生一个end-of-stream迭代器     {        advance(cinPos,2);        if (cinPos != istream_iterator<string>()) //别忘了检查        {            *coutPos++ = *cinPos++;        }    }    cout << endl;    return 0; } /* 输入:no one object if you are dong a good programming juob for someone you respect 输出: object are good for you  */

总结

ostream_iterator使用方法如下

ostream_iterator<型别>(cout,delim) obj;//delim是分隔符

isteram_iterator的使用方法

istream_iterator<型别>(cin) obj;////读取while (obj != istream_iterator<型别>() )就是输入流迭代器得有个end-of-stream迭代器来标识读取结束,而这个end-of-stream迭代器一般由其默认构造函数生成
0 0
原创粉丝点击