天天看点

STL源码学习之迭代器iterator 【2013.11.15】

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

STL源码学习之迭代器iterator 【2013.11.15】

STL源码学习之迭代器iterator 

学习来源《STL 源码剖析》 侯捷译

【2】SGI STL迭代器iterator

迭代器在STL中的低位是很重要的,可以说有了,STL容器才有存在的意义。一个东西存在的意义在于,让别人能够使用,能够操作,迭代器之于容器,就是这样的 关系;有了迭代器,我们才能使用容器,才能操作容器!

若把你的学识比作容器,那迭代器就是你的口眼手脚,其他人想了解你,只有通过你的口眼手脚来了解,来影响。从而得到你的学识。认识你。重用你!(不大严谨的比喻)

STL的迭代器使用一种Traits编程技巧,来实现迭代器对容器数据的识别,操作,等...

因而有五种迭代器内部标识,来实现迭代器功能。STL的标准迭代器内部都需要有这五种标识。

STL源码学习之迭代器iterator 【2013.11.15】

iterator_category//表示 迭代器的种类,有什么样的功能 { 只写,只读,读写,双向可操作,随机可操作。五种};

value_type // 表示迭代器指向内容的 类型 ;

difference_type//表示两个迭代器之间的距离 ;

pointer //指针操作 *

reference //取址操作 &

STL中,想自己实现迭代器,就需要定义以上五种标识。

STL定义了一个 iterator 内部定义(单单是定义)了以上五种标识,定义自己的迭代器的时候可以继承iterator 就可以,如果不想的话,就需要自己定义了。

【如deque的迭代器就是没有继承STL的iterator ,而自己定义实现的五种标识。】

STL的iterator 代码如下:

STL源码学习之迭代器iterator 【2013.11.15】

可以看到, diffrence_type,pointer,reference都是有默认值的。

【ptrdiff_t是c/c++标准库中定义的与机器相关的数据类型,保存的是两个指针相减的结果,这样就能表示两个迭代器之间的距离了。】

关于iterator_category的五种类型【只读,只写,可读写,可双向,可随机】

而且迭代器的类型是根据设计容器的人,对迭代器的要求而决定的,所以迭代器是在容器设计之初就确定了的,而不是通过编译期代码确定的!

STL 中是这样定义五种类型的,其中有继承关系,一层比一层扩展。

STL源码学习之迭代器iterator 【2013.11.15】

STL中,在决定使用那种迭代器类型的时候,由传入的迭代器类型来决定迭代器类型,很简单,看代码:

STL源码学习之迭代器iterator 【2013.11.15】

这是iterator_category的构造方法,由传入的Iterator返回对应的iterator_category类型 category。

STL源码学习之迭代器iterator 【2013.11.15】

确定迭代器距离类型,就是一个static_cast<>类型转换 。【根据类型计算距离 】

STL源码学习之迭代器iterator 【2013.11.15】
STL源码学习之迭代器iterator 【2013.11.15】

计算距离。distance为暴露接口,内部调用重载方法__distance,根据category()的不同。调用不同重载方法计算,

【随机读取迭代器可以直接相减就计算出距离(如连续内存内的指针),另外的迭代器则只能通过遍历,获取距离(如链表的指针)】

STL源码学习之迭代器iterator 【2013.11.15】

其实也是强制转换...和判断迭代器类型一样

STL源码学习之迭代器iterator 【2013.11.15】

advance(迭代器的前进或者后退)为暴露的外部方法,内部由重载的__advance方法实现。和__distance的重载方式一样。是根据iterator_category()来判断迭代器内部类型。是写的 还是 双向 还是随机的。

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611 

STL源码学习之迭代器iterator 【2013.11.15】

继续阅读