一 迭代器适配器(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()。