stl迭代器原理

具体实现肯定不如书上讲的清楚了,这里只是根据侯捷书上的讲解,自己建立一条思路以及形成一些相关的概念

迭代器也可被称作智能指针,用于遍历容器内的元素,stl每个容器都实现了自己的iterator,iterator可以是一个类对象,也可以是原生指针

因此对迭代器进行解应用操作的时候需要重载* ->运算符,使之能正确返回元素对象,这两个重载是迭代器的核心

另外stl实现了算法和容器的泛型,如何能使算法顺利的对容器进行操作,这又是stl的泛型化必须要解决的问题

这时迭代器又扮演了中介的角色,只需把容器的迭代器传给算法就可以对容器进行操作

新问题又出现了,算法接受迭代器作为参数,这其中又可能用到迭代器所关联的元素型别,比如以关联型别作为返回值

如何获取迭代器关联型别,惯性思维我们可能会这样来做:

iterator::value_type fun();

但是当迭代器是原生指针时,这种用法就不合乎语法了,比如int*,它根本就不是一个类,value_type也就无从谈起了

单独为原生指针弄一套算法是可以,但却背离了泛型思想的初衷,也不可能抛弃原生指针,也就是说iterator本身已经定型,它已经

满足了我们操作容器内部元素的需要,不能在iterator上做文章,因此引入第三方是个不错的办法,也是程序设计中常用的一种思想

关联的双方都没有改进余地的时候,引入第三者总是可以起到四两拨千斤的作用,也就是stl中的traits机制

算法不直接取迭代器的关联型别,而是通过一个traits类来获取,如下

template <class T>

class I_traits

{

typedef typename T::value_type value_type;

};

typename I_traits<iter>::value_type fun();

这样并体现不出traits调停者的作用

为了支持原生指针,除了通用性traits模板,还可以建立该模板的偏特化版本,对模板参数类型作进一步的限制

template <class T>

class I_traits<T *>

{

typedef typename T::value_type value_type;

};

好了不直接使用iterator的valuetype而是通过traits类对iterator进行提取,这样就避免了原生指针不能携带自己的关联型别这种特殊情况,使迭代器的使用方仍然能得到迭代器的关联型别

无论iterator是不是原生指针对traits类型调用valuetype成员都是合法的。

posted @ 2013-08-24 16:47  SKY_VIEW  阅读(848)  评论(0编辑  收藏  举报