zoukankan      html  css  js  c++  java
  • C++STL:流迭代器

    流迭代器是一种迭代器适配器。istream_iterator用于读取输入流,ostream_iterator用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型算法从流对象中读数据或将数据写入到流对象中。

    流迭代器的构造函数如下:

    流迭代器的基本操作如下:

    1、流迭代器的定义。

    流迭代器都是类模板:任何已定义输入操作符(>>操作符)的类型都可以定义istream_iterator,任何已定义输出操作符(<<操作符)的类型都可以定义ostream_iterator。

    istream_iterator<int> cin_it(cin);            //从cin读取int型数据
    istream_iterator<int> end_of_stream;            //指向超出末端位置

    ofstream outfile;
    ostream_iterator<int> output(outfile, " ");

    注意:

    (1)在创建流迭代器时,必须指定迭代器所读写的对象类型。

    (2)ostream_iterator不提供超出末端迭代器。

    (3)创建ostream_iterator对象时,可提供第二个(可选的)实参,指定将元素写入输出流时使用的分隔符。分隔符必须是C风格字符串,所以必须以空字符结束,否则其行为是未定义的。

    2、istream_iterator对象上的操作。

    提供了输入操作符(>>)的任何类型都可以创建istream_iterator对象。构造与流绑定在一起的istream_iterator对象时,将对迭代器定位到第一个值。下面有两段程序是等价的:

    /*程序1*/
    istream_iterator<int> in_iter(cin);
    istream_iterator<int> eof;
    vector<int> vec;

    while (in_iter != eof)
    {
        vec.push_back(*in_iter++);
    }

    /*程序2*/
    istream_iterator<int> in_iter1(cin);
    istream_iterator<int> eof1;
    vector<int> vec(in_iter1, eof1);

    程序1从cin中读取int型数据,并将读入的内容保存到vec中。当输入非int型数值或到达文件结束停止。程序2用一对标记元素范围的迭代器构造vec对象,效果与程序1相同。

    3、ostream_iterator对象上的操作。

    可用ostream_iterator对象将一个值序列写入流中。

    ostream_iterator<string> out_iter(cout, " ");
    istream_iterator<string> in_iter(cin), eof;

    while (in_iter != eof)
    {
        *out_iter++ = *in_iter++;
    }

    4、流迭代器的限制。

    (1)不可能从ostream_iterator对象读入,也不可能写到istream_iterator对象中。

    (2)一旦给ostream_iterator对象赋了一个值,写入就提交了。赋值后,没有办法再改变这个值。此外,ostream_iterator对象中每个不同的值都只能正好输出一次。

    (3)ostream_iterator没有->操作。

    5、与算法一起使用流迭代器。

    算法是基于迭代器操作实现的。由于流迭代器支持迭代器操作,因此至少可在一些泛型算法上使用这类迭代器。

     1 #include <iostream>
     2 #include <iterator>
     3 #include <vector>
     4 #include <string>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 int main(void)
     9 {
    10    istream_iterator<int> cin_it(cin);
    11    istream_iterator<int> end_of_stream;
    12 
    13    vector<int> vec(cin_it, end_of_stream);
    14    sort(vec.begin(), vec.end());
    15    
    16    ostream_iterator<int> output(cout, " ");
    17    unique_copy(vec.begin(), vec.end(), output);
    18    cout << endl;
    19 
    20    return 0;
    21 }

    输出结果为:

    ------------------------------分割线------------------------------

    来源:http://www.linuxidc.com/Linux/2015-02/113455.htm

  • 相关阅读:
    管理表空间和数据文件——维护表空间——改变表空间的读写状态和改变表空间名称
    管理表空间和数据文件——数据库逻辑结构
    管理用户和PROFILE ——管理PROFILE——使用PROFILE管理口令
    管理对象空间——管理存储参数
    管理表空间和数据文件——显示表空间和数据文件信息
    oracle Wallet的使用
    管理表空间和数据文件——维护表空间——设置默认表空间和删除表空间和删除数据文件盒临时文件
    管理用户和PROFILE——用户方案和profile
    管理表空间和数据文件——建立表空间——建立临时表空间
    启动和停止数据库——停顿和暂停数据库
  • 原文地址:https://www.cnblogs.com/ll-10/p/5461374.html
Copyright © 2011-2022 走看看