stream iterators C++ 用法

来源:互联网 发布:淘宝如何设置全场折扣 编辑:程序博客网 时间:2024/05/08 19:42

流迭代器(Stream Iterators)

1 输出流迭代器(Ostream Iterators)

输出流迭代器可以把指定的内容直接写入指定的ostream。Ostream Iterator的实现原理跟Insert Iterator非常相似,唯一的区别就是Ostream Iterator利用<<输出操作符把值输出到了ostream对象。通过流迭代器,算法就可以使用通用的迭代器接口把相应的内容输出到流对象。
下面列出了Ostream Iterator可以进行的所有操作:
操作表达式作用效果ostream_iterator(ostream)针对ostream创建一个Ostream Iteratorostream_iterator(ostream, delim)针对ostream创建一个Ostream Iterator,同时指定输出元素之见的间隔符为delim(类型为const char *)*iterNo-op(just return iter)iter=value把value值输出到ostream:ostream << value (如果设置了delim分隔符,则后跟分隔符)iter++No-op(just return iter)++iterNo-op(just return iter)

 下面是一个使用ostream iterator的例子:

//ostriter.cpp
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
        //create a ostream iterator for cout stream
        ostream_iterator<int> iter(cout, "\n");
        //write some elements to cout with ostream iterator
        *iter = 1;
        iter++;
        *iter = 2;
        iter++;
        *iter = 3;
        iter++;
        //define a vecotr container col1
        vector<int> col1;
        //insert some elements into col1
        for(int i = 1; i <= 9; ++i)
        {
                col1.push_back(i);
        }
        //copy all elements of col1 to standard output
        copy(col1.begin(), col1.end(), ostream_iterator<int>(cout));
        cout << endl;
        //copy all elements of col1 to standard output with " < " delim
        copy(col1.begin(), col1.end(), ostream_iterator<int>(cout, " < "));
        cout << endl;
}

执行结果是:

1
2
3
123456789
1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < 

2 输入流迭代器(Istream Iterators)
Istream Iterators从一个输入流(Input stream)读取元素,借助输入流迭代器,C++标准库中的算法可以直接从一个流(stream)中读取数据。
在创建一个输入流迭代器时,通常要提供一个输入流(istream)对象来进行初始化,以便从这个流中读取数据,然后就可以使用统一的迭代器接口(Interface)来逐个元素地读取流中的数据了。但是,读取元素的操作可能是会失败的(流结束或者发生错误),并且C++标准库中的很多算法是需要提供迭代器范围(half-open range)来标识元素集合。为了解决这个问题,输入流迭代器特意设计了一个特殊的Istream Iterator: end-of-stream iterator,end-of-stream iterator使用输入流迭代器的缺省构造函数来创建。当使用一个Istream Iterator来读取流时,当读取到达流结尾或者发生了错误读取失败,当前的输入流迭代器都会变成end-of-stream iterator。因此每当进行一次读取后,都应该跟end-of-stream iterator来进行比较以判断下一次读取是否有效。
通常,输入流迭代器的构造函数打开输入流并且读取第一个元素,但是在具体实现上也可能是直到第一次调用*操作符时才读取第一个元素,这依赖于具体的实现。
操作表达式作用效果istream_iterator()创建一个end-of-stream输入流迭代器istream_iterator(istream)为istream流对象创建一个输入流迭代器(构造函数可以设计成读取第一个元素,也可以设计成不读取,这取决于具体实现)*iter返回当前元素的值,该元素之前已经从流对象中读取(如果构造函数设计成不读取第一个元素,则在第一次进行该操作时读取第一个元素)iter->member返回当前元素的一个成员,该元素之前已经从流对象中读取iter++返回当前元素的iterator位置,并读取下一个元素++iter读取下一个元素并返回它的iterator位置iter1 == iter2测试iter1和iter2是否相等iter1 != iter2测试iter1和iter2是否不相等

下面看一个使用输入流迭代器的例子:
//istriter.cpp
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
        //create a istream iterator for cin stream object
        istream_iterator<int> intReader(cin);

        //create a end-of-stream iterator
        istream_iterator<int> EndOfReader;

        while(intReader != EndOfReader)
        {
                cout << "once: " << *intReader << endl;
                cout << "agine: " << *intReader << endl;
                ++intReader;
        }
}
如果输入是:1 2 3 4 f 5 6
那么执行结果是:
once: 1
agine: 1
once: 2
agine: 2
once: 3
agine: 3
once: 4
agine: 4
可以看到字符f终止了输入流的读取,当intReader读取到f时,因为格式错误,intReader变成了end-of-stream iterator,所以循环退出,程序结束。
原创粉丝点击