前言:
而今朋友们对“迭代器的种类”大体比较注意,姐妹们都想要分析一些“迭代器的种类”的相关资讯。那么小编也在网络上网罗了一些有关“迭代器的种类””的相关资讯,希望大家能喜欢,我们快快来学习一下吧!一、STL中的算法
1、STL中的算法会对容器中的数据进行处理,但是算法与容器的数据之间并没有直接联系,而是通过迭代器作为中间层,使得算法能处理容器中的数据。
2、各种容器中,迭代器的分类
目前有5种迭代器类型
(1)输入迭代器
struct input_iterator_tag{};
(2)输出迭代器
struct output_iterator_tag{};
(3)单向链表迭代器
struct forward_iterator_tag : public input_iterator_tag{};
(4)双向链表迭代器
struct bidirectional_iterator_tag : public forward_iterator_tag{};
(5)随机访问迭代器
struct random_access_iterator_tag : public didirectional_iterator_tag{};
3、各个容器使用迭代器分析
序列型容器
(1)Array:是一个固定大小的数组,在一块连续的内存中,一次可以根据索引随机跳转到任意位置,因此使用的是随机访问迭代器(random_access_iterator_tag)。
(2)Vector:是一个动态的数组,在一块连续的内存中,也可以随机跳转的任意位置,因此使用的是随机访问迭代器(random_access_iterator_tag)。
(3)Deque:是分段连续存储的,但是给使用者一个假象,让使用者感觉是连续的,内部实现做了连续性处理,因此使用的是随机访问迭代器(random_access_iterator_tag)。
(4)List:是双向链表,每一个结点都是一块单独的内存,通过每一个结点的指针指向下一个结点,因此内存是不连续的,所以使用的是双向链表迭代器(bidirectional_iterator_tag)。
(5)Forward_List:单项链表,与双向链表类似,因此使用的是单向链表迭代器(forward_iterator_tag)。
关联型容器
(1)set/multiset/map/multimap
因为其底层使用的红黑树,而红黑树每个结点直接的关系是通过双向链表索引的,因此使用的是双向链表迭代器(bidirectional_iterator_tag)。
(2)unordered_set/unordered_multiset/unordered_map/unordered_multimap
因为其底层结构使用的hash_table,而hash_table中的每个篮子使用的是双向链表,或者是单向链表,因此根据不同平台对标准库处理的不同,可以分为使用双向链表迭代器(bidirectional_iterator_tag)或者使用单向链表迭代器(forward_iterator_tag)。
4、容器所使用迭代器测试代码
测试结果如下:
从结果可以看出来,VS下的容器unordered_set/unordered_multiset/unordered_map/unordered_multimap的底层hash_table,每个篮子所采用的的是双向链表。
5、istream_iterator的iterator_category
不论那个版本的istream_iterator都在定义自己的迭代器类型,即input_iterator_tag。
6、ostream_iterator的iterator_category
7、iterator_category对算法的影响
8、iterator_category和type traits对算法的影响
copy函数
destroy函数
标签: #迭代器的种类