一 概述(纵使千变化万,始终是扮演迭代器的部分作用,所以只能出现在需要迭代器的地方):
STL提供的迭代器配接器包括:insert iterator、reverse iterator和stream iterator。
使用时需包含<iterator>头文件。其中Insert iterators和Reverse iterators定义于<bits/stl_iterator.h>中,Stream iterators定义于<bits/stream_iterator.h>头文件中。
二 inserter iterator:
(1)所谓insert iterator:即将一般迭代器的赋值操作变为插入操作。
主要观念:每一个insert iterators内部都维护有一个容器(必须由用户指定);容器当然有自己的迭代器。于是,客户端对insert iterators做赋值操作时,就在insert iterators中转化为该容器的迭代器的插入操作。即在insert iterators的operator =中调用底层迭代器的push_back()、push_front()和insert()操作函数。insert iterators的++、--、*、->等操作无意义,或者就是不允许的。
(2)相关操作:
(2)分类:
insert iterators分为三种:
back_insert_iterator(对应函数back_inserter(container &x));
front_insert_iterator(对应函数front_inserter(container &x));
insert_iterator(对应函数inserter(container &x,Iterator i));
(3)使用方法:
容器本身必须支持Insert迭代器所调用的函数,否则该中迭代器就不可用。
因此,back inserters操作只能用在vector、deque、list和strings身上;front inserters只能用在deque和list身上。
1.直接使用class来创建:
back_insert_iter<vector<int> > iter(vec);
front_insert_iter<deque<int> > iter(que);
insert_iterator<vector<int> >iter(vec)
2.使用辅助函数:
back_inserter();
front_inserter();
inserter();
3.直接用构造函数产生临时对象。
如:back_insert_iterator<vector<int> >(vec)
使用如下:
#include<iostream>
#include<iterator>
#include<vector>
#include<algorithm>
#include<deque>
using namespace std;
struct display
{
void operator()(const int &temp)
{cout<<temp<<endl;}
};
int main()
{
int array[]={1,3,5,7,9,2,4,6,8};
vector<int> vec1(array,array+9);
vector<int> vec2,vec3;
copy(vec1.begin(),vec1.end(),back_inserter(vec2));//使用辅助函数创建。
for_each(vec2.begin(),vec2.end(),display());
cout<<endl;
//copy(vec1.begin(),vec1.end(),front_inserter(vec3));//错误,vector不支持push_front().
deque<int> que;
front_insert_iterator<deque<int> >iter(que);//直接使用类创建。
copy(vec1.begin(),vec1.end(),iter);
for_each(que.begin(),que.end(),display());
cout<<endl;
copy(vec1.begin(),vec1.end(),inserter(que,que.end()));
for_each(que.begin(),que.end(),display());
}
三 reverse iterator:
reverse iterator:将一般迭代器的前进方向进行逆转。
(1)使用方法:
1. 所有容器都可以通过成员函数rbegin()和rend()分别产生出reverse iterator,它们共同定义一个半开区间。
rbegin()传回逆向遍历的第一个元素,也就是实际上最后一个元素的位置。
rend()传回逆向遍历时最后一个元素的下一个位置,也就是实际上第一个元素的前一个位置。
2. 可以将一般迭代器转化为一个Reverse迭代器,原先的迭代器必须具有双向移动能力。
如:vector<int>::reverse_iterator rpos(pos)。
3. 以base()将逆向迭代器转回正常迭代器。
逆向迭代器提供了一个base()成员函数,将逆向迭代器转回正常的迭代器。
如:vector<int> rrpos=rpos.base()。
四 iostream iterator:
iostream iterator:可以将迭代器绑定到某个iostream对象身上。
绑定到istream对象(例如:std::cin),称为istream_iterator。
绑定到ostream对象(例如:std::cout),称为ostream_iterator。
(1)istream_iterator:
所谓绑定一个istream object,其实就是在istream iterator内维护一个istream number,客户端对于这个迭代器所做的operator ++操作,会被引导调用迭代器内部所含的那个istream member的输入操作。这个迭代器是Input Iterator,不具备operator --。
相关操作:
使用方法:
1.istream_iterator<T> iter(产生一个EOF迭代器,end of stream)
或istream_iterator<T> iter(cin)(只要客户端定义一个istream_iterator并绑定到某个istream对象,程序便立刻停在istream_iterator<T>::read()等待输入一个T类型的值 )
例如:
istream_iterator<int> intRead(cin);//程序停在这里,等待输入一个int类型的值。
istream_iterator<int> intEof;//产生一个end of stream迭代器
while(intRead!=intEof)
{
cout<<*intRead<<endl;
++intRead;//调用istream的++就引导迭代器内所含的istream的输入operator>>操作。
}
2.直接调用构造函数产生临时对象。
(2)ostream_iterator
所谓绑定到一个ostream object,就是在其内部维护一个ostream object,客户端对于这个迭代器所做的operator=操作,会被引导调用对应的(迭代器内部所含的)那个ostream member的输出操作(operator <<)。这个迭代器是OutputIterator。
相关操作:
使用方法:
1.直接使用类创建迭代器对象:
例如:
ostream_iterator<int> iter1(cout);
ostream_iterator<int> iter2(cout,"\n");
2.使用构造函数创建临时的迭代器对象:
例如:
copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout));
copy(vec1.begin(),vec1.end(),ostream_iterator<int>(cout,"\n"));