Reverse(逆向)迭代器
Reverse迭代器是一种配接器。 重新定义递增运算和递减运算。使其行为正好倒置。
如果你使用这类迭代器,算法将以逆向次序处理元素。所有标准容器都允许使用Reverse迭代器来遍历元素。下面是个例子:
1 #include <iostream> 2 #include <list> 3 #include <algorithm> 4 using namespace std; 5 6 void print(int elem) 7 { 8 cout<<elem<<' '; 9 } 10 11 int main() 12 { 13 list<int> coll; 14 for(int i=1;i<=9;++i) 15 coll.push_back(i); 16 for_each(coll.begin(),coll.end(),print); 17 cout<<endl; 18 for_each(coll.rbegin(),coll.rend(),print); 19 cout<<endl; 20 }
Insert(安插型)迭代器
通过这种迭代器,算法可以执行安插行为而非覆盖行为。它提供以下操作
C++标准程序库提供三种Insert迭代器:back Inserters、front inserters、general Inserters。它们之间的区别在于插入位置。
事实上它们各自调用所属容器中不同的成员函数。
显然,容器本身必须支持Insert迭代器所调用的函数,否则该种Insert迭代器就不可用。
下面展示了back inserters的用法
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include "print.cpp" 5 using namespace std; 6 7 int main() 8 { 9 vector<int> coll; 10 back_insert_iterator<vector<int> > iter(coll); 11 *iter=1; 12 iter++; 13 *iter=2; 14 iter++; 15 *iter=3; 16 PRINT_ELEMENTS(coll); 17 back_inserter(coll)=44; 18 back_inserter(coll)=55; 19 PRINT_ELEMENTS(coll); 20 coll.reserve(2*coll.size()); 21 copy(coll.begin(),coll.end(),back_inserter(coll)); 22 PRINT_ELEMENTS(coll); 23 }
Stream(流)迭代器
我们可以通过Stream迭代器把stream当成算法的原点和起点。
一个istream迭代器可用来从input stream中读取元素,而一个ostream迭代器可以用来对output stream写入元素。
1.Ostream迭代器
ostream迭代器可以将被赋予的值写入output stream中。如此一来算法就可以使用一般的迭代器接口直接对stream执行涂写动作。下面列出ostream迭代器的各个操作函数。
下面演示ostream迭代器的用法
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <iterator> 5 using namespace std; 6 7 int main() 8 { 9 ostream_iterator<int> intWriter(cout," "); 10 *intWriter=42; 11 intWriter++; 12 *intWriter=77; 13 intWriter++; 14 *intWriter=-5; 15 vector<int> coll; 16 for(int i=1;i<=9;++i) 17 coll.push_back(i); 18 copy(coll.begin(),coll.end(),ostream_iterator<int>(cout)); 19 cout<<endl; 20 copy(coll.begin(),coll.end(),ostream_iterator<int>(cout," < ")); 21 cout<<endl; 22 }
2.istream迭代器
istream迭代器用来从input stream读取元素。透过istream迭代器,算法可以从stream中直接读取数据。
下面是istream迭代器的各项操作函数
下面展示istream迭代器的各项操作
1 #include <iostream> 2 #include <iterator> 3 using namespace std; 4 5 int main() 6 { 7 istream_iterator<int> intReader(cin); 8 istream_iterator<int> intReaderEOF; 9 while(intReader!=intReaderEOF) 10 { 11 cout<<"once: "<<*intReader<<endl; 12 cout<<"once again: "<<*intReader<<endl; 13 ++intReader; 14 } 15 }