• 转载:stream iterators C++ 用法


    流迭代器(Stream Iterators)

    1 输出流迭代器(Ostream Iterators)

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

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

    View Code
    //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是否不相等
    下面看一个使用输入流迭代器的例子:
    View Code
    //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,所以循环退出,程序结束。
  • 相关阅读:
    线程、同步
    异常、线程
    Map
    List、Set
    Collection、泛型
    Object类、常用API
    h5-上传图片预览
    js 获取get参数
    《转》完美解决微信video视频隐藏控件和内联播放问题
    写入文件(覆盖文件的内容)
  • 原文地址:https://www.cnblogs.com/gray035/p/3036754.html
Copyright © 2020-2023  润新知