迭代器之三种配接器小结

三种迭代器配接器:

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指针移到文件尾端,使得其输出为空。

三、逆向迭代器

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

 

posted on 2013-04-15 11:24  wickedboy237  阅读(321)  评论(0编辑  收藏  举报

导航