您的位置:首页 > 大数据 > 人工智能

STL源码剖析学习三:迭代器与traits

2012-04-21 14:24 232 查看
STL的中心思想在于:将数据容器与算法分开,彼此独立设计,然后用胶合剂将他们撮合在一起。

迭代器最重要的操作就是对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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: