三 迭代器(三)迭代器适配器(Iterator adapters)

一 迭代器适配器(Iterator adapters)

迭代器是一个纯粹抽象概念:任何东西,只要行为类似迭代器,它就是一个迭代器。

C++标准程序库提供了数个预先定义的特殊迭代器,即所谓迭代器适配器,它不仅起辅助作用,还能赋予整个迭代器抽象概念更强大的能力。

使用时需包含<iterator>头文件。其中Insert iterators和Reverse iterators定义于<bits/stl_iterator.h>中,Stream iterators定义于<bits/stream_iterator.h>头文件中。

   三种迭代器适配器类型:

1. Insert iterators(安插型迭代器)

2. Stream iterators(流迭代器)

3. Reverse iterators(逆向迭代器)


二 Insert Iterators(安插型迭代器):

Insert Iterators:可以使算法以安插方式而非覆写方式运作。


(1)三种预先定义的Insert Iterators:



1. Back inserters:(安插于容器最尾端):

Back Inserters的内部调用push_back(),在容器的尾端插入元素。

只有在提供有push_back()成员函数的容器中,back_inserters才能派上用场。在C++标准程序库中,这样的容器有:vector,deque,list。


2. Front inserters(安插于容器的最前端):

Front inserters调用push_front(),将元素安插于容器最前端。

Front inserters只能用于提供有push_front()成员函数的容器,在标准程序库中,这样的容器有deque和list。


3. General inserters(一般性安插器):

将元素插入“初始化时第二参数”所指位置的前方。Inserters内部调用insert(),并以新值和新位置作为参数。

所有STL容器都提供有insert()成员函数,因此,这是唯一可用于关联容器身上的一种预定义的insert。

例子:


三 Stream Iterators(流迭代器)

Stream Iterator:一种用来读写stream(流)的迭代器;包括:istream_iterator和ostream_iterator。(使用时需要#include<iterator>)

如:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>
using namespace std;
int main()
{
vector<string> vec;
copy(istream_iterator<string>(cin),//产生一个从"标准流cin"读取数据的stream iterator,元素透过一般的operator>>读取进来。
istream_iterator<string>(),//产生一个代表“流结束符号”(end of stream)的迭代器。
back_inserter(vec));
sort(vec.begin(),vec.end());
unique_copy(vec.begin(),vec.end(),
ostream_iterator<string>(cout,"\n"));//产生一个output stream iterator,通过operator<<向cout写入strings,第二个参数用来作为元素之间的分隔符。
}

四 Reverse Iterators(逆向迭代器)


生成方法:

1. 所有容器都可以通过成员函数rbegin()和rend()分别产生出reverse iterator,它们共同定义一个半开区间。

rbegin()传回逆向遍历的第一个元素,也就是实际上最后一个元素的位置。

rend()传回逆向遍历时最后一个元素的下一个位置,也就是实际上第一个元素的前一个位置。


2. 可以将一般迭代器转化为一个Reverse迭代器,原先的迭代器必须具有双向移动能力。

如:vector<int>::reverse_iterator rpos(pos)。


3. 以base()将逆向迭代器转回正常迭代器。

逆向迭代器提供了一个base()成员函数,将逆向迭代器转回正常的迭代器。

如:vector<int> rrpos=rpos.base()。





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值