Traits就像一台”特性萃取机“,它可以毫无偏差的榨取各个迭代器的特性。在讲Traits之前,我们先要把迭代器的特性搞清楚。
什么是迭代器的特性?
迭代器的特性就是迭代器的型别,最常用的迭代器的5中种型别(这5种型别都为内嵌型别),每一种迭代器都有以下五种型的定义:
1.value_type
迭代器所指向对象的类型
2.difference_type
表示两个迭代器之间的距离,可以用来表示一个容器的最大容量。对于连续空间的容器而言,头尾之间的距离就是最大容量。
针对不同的迭代器,都有不同的difference_type,在Traits(迭代器特性萃取机)中有针对原生指针而写的特化版本,它以c++标准库中ptrdiff _t(头文件<stddef.h>或<cstddef>)作为原生指针的difference_type。原则上原生指针也是一种迭代器。
源码:
////////////////////////////////////////////////////////////
//原版(未特化版本)
template<class I>// I为一个迭代器类型
struct iterator_traits
{
...
typedef typename I::difference_type difference_type;
};
////////////////////////////////////////////////////////////
//针对原生指针 T* 设计的偏特化版本
template<class T>
struct iterator_traits<T*>
{
...
typedef ptrdiff_t difference_type;
};
////////////////////////////////////////////////////////////
//针对原生指针 const T* 设计的偏特化版本
template<class T>
struct iterator_traits<const T*>
{
...
typedef ptrdiff_t difference_type;
};
ptrdiff _t:c/c++标准库中定义的一个与机器相关的
数据类型,ptrdiff _t类型变量通常用来保存两个指针加减法操作得到的结果,通常被定义成long int类型。
3.reference__type
迭代器指向对象类型的引用 ,比如我们在实现对operator*的重载时:
Item& operator*()const//Item是迭代器指向对象的类型
{
return *ptr;
}
Item&就是一个reference__type。
4.pointer_type
迭代器指向对象类型的指针,比如在实现operator->()重载时:
Item* operator*()const//Item是迭代器指向对象的类型
{
return ptr;
}
Item*就是一个pointer_type
在Traits中原生指针和const原生指针的偏特化版本中同样对pointer_type和reference__type做出了自己的定义。
////////////////////////////////////////////////////////////
//原版(未特化版本)
template<class I>// I为一个迭代器类型
struct iterator_traits
{
...
typedef typename I::reference__type reference__type;
typedef typename I::pointer_type pointer_type;
};
////////////////////////////////////////////////////////////
//针对原生指针 T* 设计的偏特化版本
template<class T>
struct iterator_traits<T*>
{
...
typedef T* reference;
typedef T* pointer;
};
////////////////////////////////////////////////////////////
//针对原生指针 const T* 设计的偏特化版本
template<class T>
struct iterator_traits<const T*>
{
...
typedef const T* reference;
typedef const T* pointer;
};
5.iterator_category
这个型别我们可以认为是迭代器的类型。总的来说,迭代器可分为5种类型:
①InputIterator 只读;
②OutputIterator 只写;
③ForwardIterator 可读写,但是只能前向移动;