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;
}