STL源码剖析之Iterator

Posted tanxiaxuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL源码剖析之Iterator相关的知识,希望对你有一定的参考价值。

STL源码剖析之Iterator

typename和typedef的含义

typename一般来说用法比较简单,在定义模板的时候声明一个类参数。

template <typename T>
class Demo

    T t;
;

这个时候typename和class没有任何区别。但是typename还有其他用法。一个类除了有类的成员变量、成员函数之外,还可以有类的定义。

template <class T>
class Demo

    T t;
public:
    typedef T value_type;
;

这种定义可以为外部所用,但是必须不能漏掉前缀typename,否则编译器将不知道你所用的是一个类型还是一个变量。

template <class T>
class V

    typename T::value_type v; //用别的类内部的typedef定义了一个成员变量
;

container和algorithm分隔和联系

STL中一个很重要的思想是把容器和算法区分开来。容器通过模板类来实现,算法通过模板方法来实现。前者有vector,map等等;后者则有sort,distance,find等等。

而沟通两者的桥梁就是iterator。通常algorithm不知道自己的算法是运行在什么样的容器上,但是通过iterator,算法能保证能够遍历容器里面的元素。这就是为什么iterator如此重要。

具体遍历的方法到底是不是由容器实现的呢?

iterator是一种智能指针

什么是智能指针?最直观的表现是:一个普通类持有一个指针,重载了*、->、==、!=、++等运算符,装得很像一个指针一样。

iterator的五种category

分别是InputIterator、OutputIterator、ForwardIterator、BidirectionalIterator和RandomAccessIterator。五种不同的Iterator发挥着不同的作用。这个category不是某个Iterator的字段,而是实实在在的一个类。所以category是模板的类参数之一。

template<typename _Category, typename _Tp, typename _Distance = ptrdiff_t, typename _Pointer = _Tp*, typename _Reference = _Tp&>
struct iterator

    /// One of the @link iterator_tags tag types@endlink.
    typedef _Category  iterator_category;
    /// The type "pointed to" by the iterator.
    typedef _Tp        value_type;
    /// Distance between iterators is represented as this type.
    typedef _Distance  difference_type;
    /// This type represents a pointer-to-value_type.
    typedef _Pointer   pointer;
    /// This type represents a reference-to-value_type.
    typedef _Reference reference;
;

为什么需要iterator_traits

iterator_traits的出现相当于继续再iterator类的typedef之上封了一层,但是还囊括了原生指针。

源码

以上是关于STL源码剖析之Iterator的主要内容,如果未能解决你的问题,请参考以下文章

STL源码剖析——iterators与trait编程#4 iterator源码

STL源码剖析——iterators与trait编程#3 iterator_category

STL—set和map使用及源码剖析

STL源码剖析(迭代器)

STL 之 list源码自行实现(iterator)

STL源码剖析之组件