前面介绍到iterator的一些问题,这里介绍一下迭代器内部的一些东西,首先,C++标准规定,迭代器必须要包含五个内容:这五个内容,也可以称为Iterator 的 Traits(中译为特性),这些特性按图上顺序,分别是①容器类型分类:比如说这个容器可以前向搜寻(++操作)不能后向搜寻(—操作),②容器元素的数据类型,比如string、int等等,③迭代器指针类型④迭代器引用类型,⑤两个迭代器之间的距离用的数据类型,比如觉得两个迭代器相隔不远,用unsigned int(2的32次方减1的大小),但是一旦元素过大超越这个类型的上限,就会爆掉。
这些特性是为了在算法使用时方便调用给出的,但目前来看实际中第三第四种类型并不常用。
上图右下角给出了这样的一个问题,如果给的不是迭代器的类(class类型),那么怎么办呢?
C++常用的方法是添加中间体来解决这种问题,这里加了下图的这种“萃取机”,实际它内部就是一个模板类根据传入的东西去提供那些特性。
下面是萃取机的具体实现机理:这其中要的注意的是里面其实还是用的前面讲的偏特化处理,去分别地返回迭代器的特性。
这里是完整的萃取机源码(仅关于Traits部分)可以看到指针的偏特化处理代码里面对特性category给定的类型是random_access_iterator_tag,正好符合指针的对应类型,另外,const T*的偏特化给出的指针和引用仍然是const的。