c++标准程序库提供了数个预先定义的特殊迭代器,也叫做迭代器适配器,它们不仅起辅助作用,还能赋予整个迭代器抽象概念更加强大的能力。
虽然我的前面一下博客有讲到几种迭代器的适配,但是讲的比较零散,今天翻起STL标准库,想在这里总结一下:
迭代器有三种适配器
1 Insert iterator(插入迭代器)
2 Stream iterator(流迭代器)
3 Reverse iterator(逆向迭代器)
上面是分类图,不是继承结构图喔;
个人觉得,看代码比较能解决一个人的饥渴。
插入迭代器:
#include<iostream> #include<vector> #include<list> #include<deque> #include<set> #include<algorithm> using namespace std; int main(){ list<int>l; for(int i=1;i<=9;++i){ l.push_back(i); } for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; vector<int>v; copy(l.begin(),l.end(),back_inserter(v));//后向插入器 适用于vector,deque,list for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; deque<int>d; copy(l.begin(),l.end(),front_inserter(d));//前向插入器 适用于deque,list for(deque<int>::iterator itera=d.begin();itera!=d.end();++itera){ cout<<*itera<<" "; } cout<<endl; set<int>s; copy(l.begin(),l.end(),inserter(s,s.begin()));//普通插入器 所有STL容器都支持insert()成员函数 for(set<int>::iterator itera=s.begin();itera!=s.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
都区分开来了吗?
可以参看我的另外一篇博客插入迭代器。
//istream_iterator<string>(cin)可以理解为输入流的开始位置 //istream_iterator<string>()可以理解为输入流的结束位置 //back_inserter()插入迭代器 //ostream_iterator<string>(cout,"\n")可以理解为输出的开始位置 #include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; int main(){ vector<string>v; copy(istream_iterator<string>(cin),istream_iterator<string>(),back_inserter(v));//copy(输入流,输入流结束,复制到) sort(v.begin(),v.end());//排序 for(vector<string>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; unique_copy(v.begin(),v.end(),ostream_iterator<string>(cout,"\n")); system("pause"); return 0; }
逆向迭代器(可以看我的一篇专门讲逆向迭代器的博客)
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>v; for(int i=0;i<20;++i){ v.push_back(i); } for(vector<int>::reverse_iterator itera=v.rbegin();itera!=v.rend();++itera){//反向迭代器 cout<<*itera<<" "; } cout<<endl; copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>v; for(int i=0;i<10;++i){ v.push_back(i); } for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; vector<int>::iterator it=v.begin(); advance(it,3); cout<<*it<<endl; advance(it,1); cout<<*it<<endl; advance(it,-2); cout<<*it<<endl; system("pause"); return 0; }
#include<iostream> #include<list> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>l; for(int i=-3;i<=9;++i){ l.push_back(i); } vector<int>::iterator itera; itera=find(l.begin(),l.end(),5); if(itera!=l.end()){ cout<<distance(l.begin(),itera)<<endl; cout<<distance(itera,l.end())<<endl; }else{ cout<<"not found"<<endl; } system("pause"); return 0; }
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>v; for(int i=1;i<=10;++i){ v.push_back(i); } for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; int temp=*(v.begin()); *(v.begin())=*(v.end()-1); *(v.end()-1)=temp; for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; iter_swap(v.begin()+1,v.end()-2); for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ int a[]={4,7,5,2,3,6,9,8,4,1,6,2}; vector<int>v(a,a+12); for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; for(vector<int>::reverse_iterator itera=v.rbegin();itera!=v.rend();++itera){ cout<<*itera<<" "; } cout<<endl; sort(v.rbegin(),v.rend());; for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; for(vector<int>::reverse_iterator itera=v.rbegin();itera!=v.rend();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>v; for(int i=1;i<=9;++i){ v.push_back(i); } vector<int>::iterator itera=v.end(); vector<int>::reverse_iterator ritera(itera); cout<<*itera<<endl; cout<<*ritera<<endl; system("pause"); return 0; }
#include<iostream> #include<deque> #include<algorithm> using namespace std; void print(int elem){ cout<<elem<<" "; } int main(){ deque<int>d; for(int i=1;i<=9;++i){ d.push_back(i); } deque<int>::iterator it1=find(d.begin(),d.end(),2); deque<int>::iterator it2=find(d.begin(),d.end(),7); for_each(it1,it2,print); cout<<endl; deque<int>::reverse_iterator rit1(it1); deque<int>::reverse_iterator rit2(it2); for_each(rit2,rit1,print); cout<<endl; for_each(rit1.base(),rit2.base(),print); system("pause"); return 0; }
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ vector<int>v; back_insert_iterator<vector<int> >iter(v); *iter=1; iter++; *iter=2; iter++; *iter=3; for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; back_inserter(v)=44; back_inserter(v)=55; for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; v.reserve(2*v.size()); vector<int>v2; copy(v.begin(),v.end(),back_inserter(v2)); copy(v2.begin(),v2.end(),back_inserter(v)); for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<list> #include<algorithm> using namespace std; int main(){ list<int>l; front_insert_iterator<list<int> >iter(l); *iter=1; iter++; *iter=2; iter++; *iter=3; for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; front_inserter(l)=44; front_inserter(l)=55; for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; copy(l.begin(),l.end(),front_inserter(l)); for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<set> #include<algorithm> #include<list> using namespace std; int main(){ set<int>s; insert_iterator<set<int> >iter(s,s.begin()); *iter=1; iter++; *iter=2; iter++; *iter=3; for(set<int>::iterator itera=s.begin();itera!=s.end();++itera){ cout<<*itera<<" "; } cout<<endl; inserter(s,s.end())=44; inserter(s,s.end())=55; for(set<int>::iterator itera=s.begin();itera!=s.end();++itera){ cout<<*itera<<" "; } cout<<endl; list<int>l; /*insert_iterator<list<int> >ite(l,l.begin()); *ite=1; ite++; *ite=2; ite++; *ite=3; for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; inserter(l,l.end())=44; inserter(l,l.end())=55; for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; copy(s.begin(),s.end(),inserter(l,l.begin())); for(list<int>::iterator itera=l.begin();itera!=l.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<vector> using namespace std; int main(){ vector<int>v(5); vector<int>::iterator iter=v.begin(); *iter=10086; iter++; *iter=10087; iter++; *iter=10089; for(vector<int>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; int main(){ ostream_iterator<int>out(cout," "); *out=100; out++; *out=99; out++; *out=98; cout<<endl; vector<int>v; for(int i=1;i<=9;++i){ v.push_back(i); } copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); cout<<endl; string delim="<"; copy(v.begin(),v.end(),ostream_iterator<int>(cout,delim.c_str())); cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<vector> using namespace std; int main(){ istream_iterator<string> in(cin),jieshu; vector<string>v; while(in!=jieshu){ v.push_back(*in++); } for(vector<string>::iterator itera=v.begin();itera!=v.end();++itera){ cout<<*itera<<" "; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<vector> using namespace std; int main(){ istream_iterator<int> in(cin),eof; ostream_iterator<int> out(cout," "); //while(in!=eof){ // *out++=*in++; //} while(in!=eof){ cout<<"once: "<<*in<<endl; cout<<"once again:"<<*in<<endl; ++in; } cout<<endl; system("pause"); return 0; }
#include<iostream> #include<string> #include<algorithm> using namespace std; int main(){ istream_iterator<string>in(cin); ostream_iterator<string> out(cout," "); while(in!=istream_iterator<string>()){ advance(in,2); if(in!=istream_iterator<string>()){ *out++=*in++; } } cout<<endl; system("pause"); return 0; }