• 迭代器之三种配接器小结


    三种迭代器配接器:

    1)insert iterators(安插型迭代器);

    2)stream iterators(流迭代器);

    3)Reverse iterator(逆向迭代器)。

    一、Insert Iterators:

    看下例子:

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <list>
     5 #include <deque>
     6 #include <set>
     7 
     8 using namespace std;
     9 
    10 int main()
    11 {
    12     vector<string> stringvec;
    13     string tmp;
    14     
    15     for ( int i = 0; i < 10; i ++ )
    16     {
    17         cin >> tmp;
    18         stringvec.push_back( tmp );
    19     }
    20     
    21     vector<string> str2;
    22     copy(stringvec.begin(),stringvec.end(),back_inserter(str2));
    23     vector<string>::const_iterator str2iter;
    24     for(str2iter = str2.begin(); str2iter != str2.end(); ++str2iter )
    25         cout << *str2iter << ' ';
    26     cout << endl;
    27     
    28     deque<string> deq;
    29     copy(stringvec.begin(),stringvec.end(),front_inserter(deq));
    30     deque<string>::const_iterator deqiter;
    31     for (deqiter = deq.begin(); deqiter != deq.end(); ++deqiter )
    32         cout << *deqiter << ' ';
    33     cout << endl;
    34     
    35     set<string> stringset;
    36     copy(stringvec.begin(),stringvec.end(),\
    37         inserter(stringset,stringset.begin() ) );
    38         
    39     set<string>::const_iterator setiter;
    40     for(setiter = stringset.begin(); setiter != stringset.end(); ++setiter)
    41         cout << *setiter << ' ';
    42     cout << endl;
    43         
    44     return 0;
    45 }

    其运行结果:

    安插型迭代器又分为三种:

    1)Back Inserts,用于从容器的尾端插入,其内部调用的为push_back(),即只要支持push_back()操作的都支持Back Inserts。这样的容器有三:vector,deque,list;

    2)Front Inserts,用于在前端插入,其内部调用的为push_front(),这样的容器有deque和list;

    3)general inserts为一般性安插,它内部所调用的为insert(),由于STL中每个容器都提供有insert(),这是唯一可用于关联式容器身上的一种预先定义好的inserter,也是能应用于所有容器中的inserts。

    二、stream iterators(流迭代器):

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <list>
     5 #include <deque>
     6 #include <set>
     7 #include <iterator>
     8 
     9 using namespace std;
    10 
    11 int main()
    12 {
    13     vector<string> stringvec;
    14     string tmp;
    15     
    16     copy(istream_iterator<string>(cin),istream_iterator<string>(),\
    17         back_inserter(stringvec));
    18         
    19     sort(stringvec.begin(),stringvec.end() );
    20     
    21     unique_copy(stringvec.begin(),stringvec.end(),\
    22                 ostream_iterator<string>(cout,"\n" ) );
    23 
    24     
    25         return 0;
    26 }

    运行结果为:

    这个程序的主要作用是:从标准输入中读取所有输入文字,对它们进行排序,再将这些文字无重复的写到终端。

    其中istream_iterator<string>(cin)和istream_iterator<string>()为input stream iterator。

    istream_iterator<string>(cin)表示从标准输入获取一串字符,默认是以空格隔开的。

    istream_iterator<string>()调用默认的istream iterator构造函数,它产生一个代表“流结束符号”(end-of-stream),表示,你不能再从中读取任何东西。

    unique_copy(stringvec.begin(),stringvec.end(),\
                     ostream_iterator<string>(cout,"\n" ) );
    将其所有元素都拷贝到目的端cout。处理过程中会消除相邻的重复值。cout之后的参数(可有可无)被用来作为元素之间的分隔符。


    要使用istream_iterator,必须包含头文件iterator!

    流迭代器的其他相关知识点:

    istream_iterator 在<iterator>头文件的定义中

    定义istream_iterator变量的方法为

    istream_iterator<T> in(strm);    (其中T指明此istream_iterator的输入类型 , strm为istream_iterator指向的流)

    提供了输入操作符(>>)和 输出操作符 (<<)的任何类型都可以创建 istream_iterator 对象和ostream_iteratorcfq对象,即对自己的类重载了这两个函数:

    istream &operator >> (istream &is, &MyClass c);

    和 ostream &operator << (ostream &os , const  &MyClass c);

    1. 若strm为空时,即比如istream<T> in();时,  此时变量in 就相当于指向EOF标志的iterator了

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <list>
    #include <deque>
    #include <set>
    #include <fstream>
    #include <iterator>
    
    using namespace std;
    
    int main()
    {
        vector<string> stringvec;
        string tmp;
        
        vector<int> intvec;
        ifstream infile("d:\\infile.txt");
        ofstream outfile("d:\\outfile.txt");
        istream_iterator<int> in(infile);
        ostream_iterator<int> out(outfile,"\t");
        
        for (; in != istream_iterator<int>(); ++in)
            cout << *in << ' ';
        cout << endl;
        
        copy(in,istream_iterator<int>(),back_inserter(intvec));
        sort(intvec.begin(),intvec.end() );
        unique_copy(intvec.begin(),intvec.end(),out);
        
        return 0;
    }

    运行结果:

                        图一

                        图二

                        图三

    for (; in != istream_iterator<int>(); ++in)
            cout << *in << ' ';
        cout << endl;

    运行结果中,outfile.txt文件为空,究其原因,是由于上面的这段代码,将in指针移到文件尾端,使得其输出为空。

    三、逆向迭代器

    其操作同一般迭代器基本相同,这里不再总结。

  • 相关阅读:
    [LeetCode] 1190. Reverse Substrings Between Each Pair of Parentheses
    [LeetCode] 923. 3Sum With Multiplicity
    [LeetCode] 643. Maximum Average Subarray I
    [LeetCode] 669. Trim a Binary Search Tree
    [LeetCode] 1743. Restore the Array From Adjacent Pairs
    [LeetCode] 888. Fair Candy Swap
    [LeetCode] 1102. Path With Maximum Minimum Value
    [LeetCode] 1631. Path With Minimum Effort
    [LeetCode] 1522. Diameter of N-Ary Tree
    [LeetCode] 1376. Time Needed to Inform All Employees
  • 原文地址:https://www.cnblogs.com/wickedboy237/p/3021709.html
Copyright © 2020-2023  润新知