STL迭代器的"特性萃取机"-----Traits

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 可读写,但是只能前向移动;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值