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

      iostream迭代器(iostream iterator):与输入或输出流绑定在一起,用于迭代遍历所关联的 IO 流。

    虽然 iostream 类型不是容器,但标准库同样提供了在 iostream 对象上使用的迭代器:istream_iterator 用于读取输入流,而 ostream_iterator 则用于写输出流。这些迭代器将它们所对应的流视为特定类型的元素序列。使用流迭代器时,可以用泛型算法从流对象中读数据(或将数据写到流对象中)。

    iostream迭代器的构造函数

    istream_iterator<T> in(strm);

    创建从输入流strm中读取T类型对象的istream_iterator对象

    istream_iterator<T> in;

    istream_iterator 对象的超出末端迭代器

    ostream_iterator<T> in(strm);

    创建将T类型的对象写到输出流strmostream_iterator对象

    ostream_iterator<T> in(strm, delim);

    创建将 类型的对象写到输出流 strm ostream_iterator 对象,在写入过程中使用 delim作为元素的分隔符。delim 是以空字符结束的字符数组(C风格字符串)。

    istream_iterator 的操作

    it1 == it2

    it1 != it2

    比较两上 istream_iterator 对象是否相等(不等)。迭代器读取的必须是相同的类型。如果两个迭代器都是 end 值,则它们相等。对于两个都不指向流结束位置的迭代器,如果它们使用同一个输入流构造,则它们也相等

    *it

    返回从流中读取的值

    it->mem

    是 (*it).mem 的同义词。返回从流中读取的对象的 mem 成员

    ++it

    it++

    通过使用元素类型提供的 >> 操作从输入流中读取下一个元素值,使迭代器向前移动。通常,前缀版本使用迭代器在流中向前移动,并返回对加 后的迭代器的引用。而后缀版本使迭代器在流中向前移动后,返回原值

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

    2)示例

    #include<iostream>
    #include<vector>
    using namespace std;
    #include<iterator>
    
    int main()
    {
        istream_iterator<int> cin_it(cin);
        istream_iterator<int> end_of_stream;
        vector<int> vec;
        
        while(cin_it!=end_of_stream)
        {
            //注意++先引用后增值,不能写出前缀
            vec.push_back(*cin_it++);
        }
        
        //也可以写成  vector<int> vec(cin_it,end_of_stream);
        for(int i=0;i!=vec.size();i++)
            cout<<vec[i];
    
        return 0;
    }

      其中end_of_stream定义为空的迭代器对象,用作结束迭代器。绑定流上的迭代器在遇到文件结束或某个错误时,将等于结束迭代器的值。

    int main(int argc, char **argv)
    {
        ostream_iterator<string> out_iter(cout, "\n");
        istream_iterator<string> in_iter(cin), EndOfStream;
        while(EndOfStream != in_iter)
        {
            *out_iter++ = *in_iter++; 
        }
        return 0;
    }

    iter++,返回iter,再*iter

    注意输出,输入 12  3 4 5,按 enter输出1 ,2 ,3 ,4,按ctrl+z输出5;

     示例3

    #include "map"
    #include "set"
    #include "vector"
    #include "string"
    #include "fstream"
    #include "iostream"
    #include "sstream"
    #include "iterator"
    #include "algorithm"
    using namespace std;
     
    int main(int argc, char **argv)
    {
        ifstream infile("C:\\1.txt");
        istream_iterator<int> cin_it(infile);
        istream_iterator<int> EndOfStream;
        vector<int> vec(cin_it, EndOfStream);
        sort(vec.begin(), vec.end());
        ostream_iterator<int> output(cout, " ");
        unique_copy(vec.begin(), vec.end(), output);
        return 0;
    }

     3)流迭代器的限制

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

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

    • ostream_iterator 没有 -> 操作符。

     

     

  • 相关阅读:
    实验吧因缺思汀的绕过注入解析
    python模块中requests参数stream
    土司论坛nc反弹神器使用方法
    msf web脚本反弹shell
    python 多线程
    metasploit后门维持技术
    ew做socks5代理
    双内网渗透代理之reGeorg+Proxifier
    SVN源码泄露漏洞
    Java反射的实例
  • 原文地址:https://www.cnblogs.com/youxin/p/2481976.html
Copyright © 2011-2022 走看看