STL源码剖析学习三:迭代器与traits
2012-04-21 14:24
232 查看
STL的中心思想在于:将数据容器与算法分开,彼此独立设计,然后用胶合剂将他们撮合在一起。
迭代器最重要的操作就是对operator*和operator->进行重载
为了不暴露容器的内部实现细节,每一种容器都有专属的迭代器,这样就可以把所有的实现细节封装起来不被使用者看到。
在迭代器的设计上使用泛型思想:
当算法中需要声明一个变量,要用到迭代器所指向的对象的类别(value_type)==>使用参数推到机制
万一需要把该类型用于函数的传回值==>声明一个内嵌类型,使用关键词typename
但并不是所有的指针类型都是class,如果是原生指针就无法定义内嵌类型==>在泛化设计中提供一个特化版本(偏特化)
偏特化:如果模板类拥有一个以上的模版参数,可以针对其中几个(不是全部)的模版参数进行特化工作。
换句话说,就是针对模版参数更进一步的条件限制所设计出来的一个特化版本。
traits技术
用traits专门提取迭代器的特性,增加了一个间隔层,就可以针对原生指针,常指针等设计不同的偏特化版本。
traits就像特性萃取机,可以萃取不同的迭代器特性,最常用的迭代器的类型
value_type迭代器所指向的对象的类型
difference_type两个迭代器之间的距离
reference_type函数要传回左值,必须用引用传递的方式进行
point_type传回一个pointer指向迭代器所指之物
iterator_category迭代器的分类:
//代码中只用作标记作用的迭代器类型,不需要任何成员
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随机访问,提供所有的指针算数能力
STL定义的iterator class,每个新设计的迭代器都继承自他,保证符合规范
迭代器最重要的操作就是对operator*和operator->进行重载
为了不暴露容器的内部实现细节,每一种容器都有专属的迭代器,这样就可以把所有的实现细节封装起来不被使用者看到。
在迭代器的设计上使用泛型思想:
当算法中需要声明一个变量,要用到迭代器所指向的对象的类别(value_type)==>使用参数推到机制
万一需要把该类型用于函数的传回值==>声明一个内嵌类型,使用关键词typename
但并不是所有的指针类型都是class,如果是原生指针就无法定义内嵌类型==>在泛化设计中提供一个特化版本(偏特化)
偏特化:如果模板类拥有一个以上的模版参数,可以针对其中几个(不是全部)的模版参数进行特化工作。
换句话说,就是针对模版参数更进一步的条件限制所设计出来的一个特化版本。
traits技术
用traits专门提取迭代器的特性,增加了一个间隔层,就可以针对原生指针,常指针等设计不同的偏特化版本。
template<class I> struct iterator_traits { typedef typename I::valu_type value_type; }; template <class I> typename iterator_traits<I>::valu_type func(I ite){ return *ite; } template<class I> struct iterator_traits<T*> { typedef T valu_type; }
traits就像特性萃取机,可以萃取不同的迭代器特性,最常用的迭代器的类型
template<class I> struct iterator_traits{ typedef typename I::iterator_category iterator_category; typedef typename I::value_type value_type typedef typename I::difference_type difference_type typedef typename I::pointer pointer typedef typename I::reference reference }
value_type迭代器所指向的对象的类型
difference_type两个迭代器之间的距离
reference_type函数要传回左值,必须用引用传递的方式进行
point_type传回一个pointer指向迭代器所指之物
iterator_category迭代器的分类:
//代码中只用作标记作用的迭代器类型,不需要任何成员
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随机访问,提供所有的指针算数能力
STL定义的iterator class,每个新设计的迭代器都继承自他,保证符合规范
template <class Category, class T, class Distance = ptrdiff_t, class Pointer = T*; class Reference = T&> struct iterator{ typedef Category iterator_category; typedef T valu_type; typedef Distance difference_type; typedef Pointer pointer; typedef Reference reference; };
相关文章推荐
- STL源码剖析—迭代器与traits编程方法
- STL源码学习——迭代器(iterators)与traits编程技法
- STL源码剖析学习六:deque
- STL源码剖析-学习之路(四)容器
- stl源码剖析 详细学习笔记priority_queue slist
- stl源码剖析之traits编程技法
- STL源码剖析-学习之路(二)配置器
- STL学习笔记——迭代器以及Traits技术
- STL源码剖析学习十九:配接器
- stl源码剖析 详细学习笔记priority_queue slist
- STL源码剖析——迭代器
- STL源码剖析学习十四:算法之set相关算法
- STL源码剖析学习十:红黑树的实现
- STL源码剖析学习十九:配接器
- STL源码剖析之 traits 技术小结【2013.12.12】
- STL 源码剖析读书笔记二:迭代器与traits
- STL源码剖析-学习笔记
- STL学习笔记之迭代器--iterator(源码剖析)
- STL源码剖析之开篇与内存配置器--学习笔记
- STL源码剖析——stl_pair.h学习