stl之迭代器(iterator)
来源:互联网 发布:mysql获取当前时间错 编辑:程序博客网 时间:2024/05/20 09:11
迭代器是一种抽象的设计概念,在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 <calss InputIterator, classDistance>inline void advance(InputIterator& i,Distance n){ __advance(i,n, iterator_category(i));}
函数中调用__advance,传入相应的迭代器类型,进而通过静态多态调用到了指定的__advance函数,__advance的实现版本有如下几个:
InputIterator版本:
template <class InputIterator, classDistance>inline void __advance(InputIterator& i,Distance n, input_iterator_tag){ while(n--)++I;}
Bidrectionalterator版本:
template <class Bidrectionalterator,class Distance>inline void __advance(BidrectionalIterator&i, Distance n, bidirectional_iterator_tag){ if(n>= 0) while(n--) ++i; else while(n--) ++i;}
RandomAccessIterator版本:
template <class RandomAccessIterator,class Distance>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<int> v(a, a+5); copy(v.begin(),v.end(), ostream_iterator<int>(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>(list)),其对应的源码片段为
back_insert_iterator<_Container>& operator=(const typename _Container::value_type& __value) { container->push_back(__value); return *this; }
在使用copy的时候会用到赋值(=)操作,参考copy的部分实现源码如下:
template <class _InputIter, class_OutputIter, class _Distance>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
- STL之iterator(迭代器)
- stl之迭代器(iterator)
- C++ stl之迭代器(iterator)
- 设计模式之iterator模式到STL中iterator迭代器
- STL学习笔记之迭代器--iterator
- STL源码剖析之迭代器Iterator
- STL之iterator
- STL之iterator
- STL之Iterator
- STL的迭代器--Iterator
- STL的迭代器--Iterator
- [STL基础]Iterator迭代器
- STL iterator(迭代器)
- STL Iterator 迭代器
- STL迭代器(iterator)
- STL----iterator 迭代器
- STL 之 iterator traits 备忘
- STL之Input & Output Iterator
- Flex-box-03 伸缩项目属性
- DOM函数
- js 正在表达式 总结
- 康托展开与逆展开
- unity OnMouseDown 不能监测鼠标右键点击事件
- stl之迭代器(iterator)
- iOS开发推送小结
- 转载 加 原创 session 和 cookie 内在联系
- maven 私服--nexus
- 命令上执上执行Yaf
- 解决EditPlus在设置了UTF-8之后,编写的HTML页面仍出现汉字乱码问题
- JDK安装出现1335错误
- 杭电2572
- 区域生长算法原理及MATLAB实现