迭代器是一种抽象的设计概念,在Gof的《design Patterns》书中提供了迭代器模式,定义如下:提供一种方法,使之能够依序遍历某个容器内的所有元素,但又无需暴露该聚合物的内部表述方式。
在stl中,迭代器充当着容器(containers)和算法(algorithms)的粘合剂,所以了解迭代器十分重要。其源码实现对应于stl_iterator_base.h
stl中提供了5种型别的迭代器,分别为:
Inputiterators 只读
Outputiterators 只写
Forwarditerators 支持++,可读可写
Bidirectionaliterators 支持++,支持--,可读可写
Randomaccess iterators 支持+n,支持-n,可读可写
从其支持的操作来看,Randomaccess iterator支持的操作最多,所以其适用的算法也越丰富。
stl中算法都是与迭代器相关的,迭代器扮演者容器对象和算法交互的中间人关系,如对advance操作(作用是将一个迭代器向前推进n步),其具体实现如下:
template
inline void advance(InputIterator& i,Distance n)
{
__advance(i,n, iterator_category(i));
}
函数中调用__advance,传入相应的迭代器类型,进而通过静态多态调用到了指定的__advance函数,__advance的实现版本有如下几个:
InputIterator版本:
template
inline void __advance(InputIterator& i,Distance n, input_iterator_tag)
{
while(n--)++I;
}
Bidrectionalterator版本:
template
inline void __advance(BidrectionalIterator&i, Distance n, bidirectional_iterator_tag)
{
if(n>= 0)
while(n--) ++i;
else
while(n--) ++i;
}
RandomAccessIterator版本:
template
inline void __advance(RandomAccessIterator&i, Distance n, random_access_iterator_tag)
{
i+= n;
}
这样,通过静态多态(重载)完美实现了迭代器与算法的衔接。
至于如何萃取型别则是trait干的事了,这边不做说明,详情可以参考侯捷的《stl源码剖析》。
另外,对于流操作,stl提供了(下面这些迭代器实现在stl_iterator.h中):
输出流迭代器ostream_iterator
输入流迭代器istream_iterator
实例(作用是输出函数):
int a[] = {1,2,3,4,5};
vector v(a, a+5);
copy(v.begin(),v.end(), ostream_iterator(cout,"\t"));
对于插入操作,stl提供了相应的插入迭代器,用于将值插入到容器中,它们也叫适配器作用是将容器转换为迭代器:
insert_iterator普通插入迭代器 ,对应的插入操作使用insert
front_insert_iterator将对象插入到数据集的前面,对应的插入操作使用push_front
back_insert_iterator将对象插入到数据集的后面,对应的插入操作使用push_back
如:copy(vec.begin(), vec.end(), back_insert_iterator(list)),其对应的源码片段为
back_insert_iterator<_Container>&
operator=(const typename _Container::value_type& __value) {
container->push_back(__value);
return *this;
}
在使用copy的时候会用到赋值(=)操作,参考copy的部分实现源码如下:
template
inline _OutputIter __copy(_InputIter__first, _InputIter __last,
_OutputIter __result,
input_iterator_tag,_Distance*)
{
for( ; __first != __last; ++__result, ++__first)
*__result = *__first;
return __result;
}
这些功能的目的是为了使容器能使用相关的算法功能。
参考:stl_algobase.h stl_iterator.h stl_iterator_base.h