六 配接器(二)iterator adapters

一 概述(纵使千变化万,始终是扮演迭代器的部分作用,所以只能出现在需要迭代器的地方):


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"));





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值