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

ostream_iterator

ostream迭代器可以将赋的值写入output stream中,它的实作机制与insert迭代器概念一致,唯一的区别在于ostream迭代器将赋值操作转换为operator<<,ostream迭代器的各个操作函数如下
STL与泛型编程<十二>:Stream(流)迭代器_第1张图片
其定义如下

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;
}

其各项操作见下图
STL与泛型编程<十二>:Stream(流)迭代器_第2张图片
如果满足以下条件,我们便说两个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迭代器一般由其默认构造函数生成

你可能感兴趣的:(STL与泛型编程<十二>:Stream(流)迭代器)