三种迭代器配接器:
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指针移到文件尾端,使得其输出为空。
三、逆向迭代器
其操作同一般迭代器基本相同,这里不再总结。