龙空技术网

C++STL学习笔记 迭代器、算法、容器之间的关系

好学松鼠my 147

前言:

而今朋友们对“迭代器的种类”大体比较注意,姐妹们都想要分析一些“迭代器的种类”的相关资讯。那么小编也在网络上网罗了一些有关“迭代器的种类””的相关资讯,希望大家能喜欢,我们快快来学习一下吧!

一、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函数

标签: #迭代器的种类