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之上封了一层,但是还囊括了原生指针。

源码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值