现在的位置: 首页 > 综合 > 正文

迭代器之Adapters(STL)

2013年08月31日 ⁄ 综合 ⁄ 共 8329字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.