欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611
STL源码学习之迭代器iterator
学习来源《STL 源码剖析》 侯捷译
【2】SGI STL迭代器iterator
迭代器在STL中的低位是很重要的,可以说有了,STL容器才有存在的意义。一个东西存在的意义在于,让别人能够使用,能够操作,迭代器之于容器,就是这样的 关系;有了迭代器,我们才能使用容器,才能操作容器!
若把你的学识比作容器,那迭代器就是你的口眼手脚,其他人想了解你,只有通过你的口眼手脚来了解,来影响。从而得到你的学识。认识你。重用你!(不大严谨的比喻)
STL的迭代器使用一种Traits编程技巧,来实现迭代器对容器数据的识别,操作,等...
因而有五种迭代器内部标识,来实现迭代器功能。STL的标准迭代器内部都需要有这五种标识。
iterator_category//表示 迭代器的种类,有什么样的功能 { 只写,只读,读写,双向可操作,随机可操作。五种};
value_type // 表示迭代器指向内容的 类型 ;
difference_type//表示两个迭代器之间的距离 ;
pointer //指针操作 *
reference //取址操作 &
STL中,想自己实现迭代器,就需要定义以上五种标识。
STL定义了一个 iterator 内部定义(单单是定义)了以上五种标识,定义自己的迭代器的时候可以继承iterator 就可以,如果不想的话,就需要自己定义了。
【如deque的迭代器就是没有继承STL的iterator ,而自己定义实现的五种标识。】
STL的iterator 代码如下:
可以看到, diffrence_type,pointer,reference都是有默认值的。
【ptrdiff_t是c/c++标准库中定义的与机器相关的数据类型,保存的是两个指针相减的结果,这样就能表示两个迭代器之间的距离了。】
关于iterator_category的五种类型【只读,只写,可读写,可双向,可随机】
而且迭代器的类型是根据设计容器的人,对迭代器的要求而决定的,所以迭代器是在容器设计之初就确定了的,而不是通过编译期代码确定的!
STL 中是这样定义五种类型的,其中有继承关系,一层比一层扩展。
STL中,在决定使用那种迭代器类型的时候,由传入的迭代器类型来决定迭代器类型,很简单,看代码:
这是iterator_category的构造方法,由传入的Iterator返回对应的iterator_category类型 category。
确定迭代器距离类型,就是一个static_cast<>类型转换 。【根据类型计算距离 】
计算距离。distance为暴露接口,内部调用重载方法__distance,根据category()的不同。调用不同重载方法计算,
【随机读取迭代器可以直接相减就计算出距离(如连续内存内的指针),另外的迭代器则只能通过遍历,获取距离(如链表的指针)】
其实也是强制转换...和判断迭代器类型一样
advance(迭代器的前进或者后退)为暴露的外部方法,内部由重载的__advance方法实现。和__distance的重载方式一样。是根据iterator_category()来判断迭代器内部类型。是写的 还是 双向 还是随机的。
欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611