关于iterator_traits的使用
iterator是算法和容器的桥梁,但是几乎所有的容器在定义iterator的时候都会有iterator traits这个函数,我们今天就来聊一下iterator traits。
一、为什么要有iterator?
二、Iterator的特性
三、Iterator里面包含的内部结构
四、为什么要有iterator_traits
五、Iterator traits的实现源码
六、总结
一、为什么要有iterator?
首先我们知道,整个STL容器是由容器和算法两部分组成的,那么开发这两部分人是不一样的(这样比较节省效率),为了解决这个问题,那么容器和算法之间需要添加一个粘合剂,这个东西就叫做iterator。
二、iterator的特性
Iterator到底是什么呢?我们可以把它理解成一个智能指针,当然了这不是说它能够自动释放,而是它封装了一层指针。
三、iterator里面所包含的内部结构
首先,正如我前面所说的,iterator最终是给算法用的,换句话说iterator里面包含什么元素取决于算法到底要什么?那么算法到底要什么呢?首先它肯定需要知道类型,以及容器类型(有的是双向,有的是随机),以及范围,所以我们针对这些设计iterator的内容。
template<typename _Tp>
struct _List_iterator
{
typedef _List_iterator<_Tp> _Self;
typedef _List_node<_Tp> _Node;
// iterator
typedef ptrdiff_t difference_type;
typedef std::bidirectional_iterator_tag iterator_category;
typedef _Tp value_type;
typedef _Tp* pointer;
typedef _Tp& reference;
}
我们主要来看后面5个(前面两个是list所独有的)
typedef ptrdiff_t difference_type;
这个我们用来表示范围,即我们要确定我们要传进算法范围的内容是多少
typedef std::bidirectional_iterator_tag iterator_category;
这个主要确定容器的选择,在容器的分类中,有单向容器,双向容器等等。那么list是一个双向容器
四、为什么要有iterator_traits
为什么要有iterator_traits呢?因为如果我们传进去的是类或者类型自然没有问题,但是如果我们传入的是指针或者常量指针就比较麻烦了,为了解决这个问题,STL容器使用了泛化指针来解决这个问题
template<typename _Iterator>
struct iterator_traits
{
typedef typename _Iterator::iterator_category iterator_category;
typedef typename _Iterator::value_type value_type;
typedef typename _Iterator::difference_type difference_type;
typedef typename _Iterator::pointer pointer;
typedef typename _Iterator::reference reference;
};
#endif
/// Partial specialization for pointer types.
template<typename _Tp>
struct iterator_traits<_Tp*>
{
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef _Tp& reference;
};
/// Partial specialization for const pointer types.
template<typename _Tp>
struct iterator_traits<const _Tp*>
{
typedef random_access_iterator_tag iterator_category;
typedef _Tp value_type;
typedef ptrdiff_t difference_type;
typedef const _Tp* pointer;
typedef const _Tp& reference;
};
这就是iterator traits的用法。