STL学习 记录
来源:互联网 发布:网络剧上瘾 台湾版 mp4 编辑:程序博客网 时间:2024/06/05 20:17
STL组件中另一个别具特色的组件:迭代器。每个标准迭代器都至少包含五中内嵌型别: value_type 所指物的类型 difference_type 元素距离 reference_type 所指物的引用 pointer_type 所指物的指针 iterator_category 迭代器的种类其中需要重点关注的是iterator_category,迭代器的种类又包括: input iterator output iterator forward iterator bidirectional iterator random access iterator 《STL源码剖析》中示例: //移动单向只读迭代器template < class InputIterator, class Distance >void advance_II(InputIterator& i, Distance n){ while (n--) ++i;}//移动双向迭代器template < class BidirectionalIterator, class Distance >void advance_BI(BidirectionalIterator& i, Distance n){ if (n >= 0) while (n--) ++i; else while (n++) --i;}//移动随机迭代器template < class RandomAccessIterator, class Distance >void advance_BAI(RandomAccessIterator& i, Distance n){ i += n;} //注意:对外我们只提供一个advace接口,可能我们类似如下做法:template < calss InputIterator, class Distance >void advance(InputIterator& i, Distance n){ if (is_random_access_iterator(i)) //假设可以通过这个函数来判断是否是随机迭代器 advance_BAI(i, n); else if (is_bidirectional_iterator(i)) //同上 advance_BI(i, n); else advance_II(i, n); //同上}这里存在的问题是对i类型的判断是在程序运行时,影响程序效率。STL使用重载技术解决这个问题:为了令其同名,形成重载我们必须加上一个型别已经确定的参数,使函数重载机制得以有效的运作起来。如果traits有能力萃取出迭代器的种类,我们便可以利用这个迭代器类型作为advance函数的第三个参数。这个相应的型别一定是一个class,不能只是类似枚举的数值,因为编译器需要依赖它(一个类型)来进行重载。下面定义5个class代表五中迭代器类型: struct input_iterator_tag{};struct output_iterator_tag{};struct forward_iterator_tag:public input_iterator_tag {};struct bidirectional_iterator_tag:public forward_iterator_tag {};struct random_access_iterator_tag:public bidirectional_iterator_tag {}; 各种迭代器的advance重载实现如下://只读迭代器移动 template< class InputIterator, class Distance> inline void __advance(InputIterator& i, Distance n, input_iterator_tag) { while (n--) ++i; } //读写迭代器移动 template< class ForwardIterator, class Distance> inline void __advance(ForwardIterator& i, Distance n, forward_iterator_tag) { __advance(i, n, input_iterator_tag()) } //双向读写迭代器移动 template< class BidiectionalIterator, class Distance> inline void __advance(BidiectionalIterator& i, Distance n, bidirectional_iterator_tag) { if (n > 0) { while (n--)++i; } else { while (n++)--i; } } //随机读写迭代器移动 template< class RandomAccessIterator, class Distance> inline void __advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag) { i += n; } //========================== //对外开放的接口: //========================== template< class InputIterator, class Distance> inline void advance(InputIterator& i, Distance n) { //这里再次通过traits机制调用具体的__advance函数: __advance(i, n, iterator_traits::interator_category());//通过萃取获取第三个参数 }而红色部分需要定义迭代器萃取结构并且偏特化:template < class I> //这个I就是我们自定义的迭代器类型,内部需要有以下5种内嵌型别 struct iterator_traits { typedef typename I::value_type value_type; typedef typename I::iterator_category interator_category; typedef typename I::difference_type differrnce_type; typedef typename I::pointer pointer; typedef typename I::reference reference; }; template < class I> struct iterator_traits { typedef I value_type; typedef random_access_iterator_tag interator_category; typedef ptrdiff_t differrnce_type; typedef I* pointer; typedef I& reference; };//如果我们要自己写一个迭代器类,结构大致如下(假设迭代器所指之物为int):class MyIterator{ typedef int value_type; typedef random_access_iterator_tag interator_category; typedef ptrdiff_t differrnce_type; typedef int* pointer; typedef int& reference;}
0 0
- Effective STL学习记录
- STL学习 记录
- STL学习记录(一):STL简介
- 有效的STL学习记录
- STL学习记录(二):迭代器简要
- STL学习记录(四):Vector
- STL学习记录(五):Deque
- STL学习记录(六):List
- STL学习记录(七):Forward List
- STL学习记录(八)Sets、Multisets
- STL学习记录(九)Maps、Multimaps
- STL学习记录(十):Iterator
- STL学习记录(十五):Stack
- C++学习记录之STL函数
- STL priority_queue优先队列容器学习记录
- STL学习之零散记录(不断更新中)
- STL学习记录(三):算法基础简要
- 学习STL过程中的一些零散记录1
- 关于NavigationItem.rightBarButtonItem设置
- Linux驱动开发常用调试工具---之devmem
- 如何设计一个框架
- CF#284 (Div. 2) C.(几何规律)
- 166 Fraction to Recurring Decimal
- STL学习 记录
- ubuntu下多个gcc版本切换
- s4
- Linux内核源码学习之 内核页表打印
- 川大教师发自白书:一所高校就是一座衙门
- oracle导入导出 创建表空间
- Secret Number
- 下载网站插件安装方法
- 去耦电容的选择以及反电势干扰的抑制