接上一篇文章,其实我们前面四个特性,我们都好理解。但是到了iterator_category(迭代器的分类)时候,其实很多人会困惑,如何才能够精准的萃取出他的分类呢,毕竟每个迭代器只对应一种分类;
迭代器总共有五中分类(英文简写):input(只写)、output(只读)、forward(一次只能前进一个单位)、bidrection(一次只能前进/后退一个单位)、random (可以随机进行移动,想去马力就去哪里),当我们的算法向迭代器进行询问,容器的分类是啥时候,迭代器要给算法进行回答,因为每个分类都有着不同的权限;所以我们要对每一个迭代器,根据容器的特性进行迭代器类别的区分;
举例子:对于list迭代器来说,当我们知道迭代器为list_iterator时候,我们就能够通过萃取机萃取出其特性 --- 我们由此也知道了list的迭代器被萃取机萃取之后的分类是:bidrection,我们又可以对这个bidrection_tag进行advance()、distance()等函数计算时候进行区分;
问题又来了,我们可以对定义过的迭代器进行萃取,那我们原生指针int* 这些怎么办,总不能说就不管了,你不告诉算法,酸粉也不能进行后序的计算啊;所以为了能让萃取机同样萃取出原生指针的五大特性,我们也对其进行了萃取;int* , char* ,char等类别都是random,所以直接会给他们打上random标签;如下图:
至此,我们也就明白了,萃取机如何萃取出每一个迭代器的category,至于tag之间的关系,以及其中更加复杂的逻辑,这就要自己阅读源码了。迭代器,其中比较重要的东西就说完了。其实迭代器本质上就是一个中间商,这个中间商他很好的衔接了算法和容器,使得数据和方法得以分离,有很好的将他们衔接在了一起。算法问他要什么,迭代器能够给予他想知道的事情,接着对容器进行操作。那容器里面又是什么,存储的是什么东西?如何存储的?容器之间的关系又是什么?有多少个容器?后面慢慢说呗~