STL容器

1 迭代器

1.1 迭代器不是指针

1.2 迭代器在概念上类似指针

它可以做加减法,它可以用*取指向的对象,但是它只能够用于操作容器。

1.3 迭代器的使用

迭代器有begin()和end()函数(指向最后一个元素的下一个函数),这提供了遍历的范围,然后加上加减法,就可以遍历了。

1.4 迭代器可以让容器和算法分开,然后通过它把这二者粘合在一起。

2 可以遍历的容器

vector、deque、list、set、hash_set、map、hash_map

3  不支持遍历的容器

stack、queue、priority_queue,这个是由该数据结构的概念定义的。

4 各个容器底层的实现

4.1 vector

用数组实现的,就是一块连续的内存区域,这个块内存区域分配之后地址保存在vector对象的start和finish成员中。所有的都可以在这个上面思考就可以了。

4.2 list

list是用链表实现的,并且是双向链表,所有的都可以在这个上面去思考。

4.3 deque

是分段连续的内存区域构成,它的两端进行操作是常数时间,但是随机访问却和vector不是一样的,它需要用index查一个map,找到所在的连续字段,然后再random access。

4.4 stack、queue

底层数据结构是deque

4.5 priority queue

底层数据结构是vector,priority queue的内部是一个heap,这样非常好取最大的元素,并且插入之后,能够迅速恢复到堆序,而用vector很容易实现一棵二叉树的堆。

4.6 slist

single direction list。

4.7 set

set就是元素的集合,不是键值对,键值对是map。set中的元素不允许相同。为了可以从一个set中快速查找一个元素,set底层的数据结构用的是红黑树。

4.8 map

map的元素是键值对,不允许有两个相同的key。底层也是红黑树。

4.9 mutiset

允许相同元素,底层是红黑树。

4.10 multimap

允许有相同的key,底层是红黑树。

4.10 hash_set

底层的数据结构使用的是hash table的set。

4.11 hash_map

底层的数据结构使用的是hash table的map。

5 STL中所使用的hash table

首先是一个指针数组,指针数组是vector,通过hash函数,找到vector中的一个bin,这个bin是一个链表。

也就是说,它会把所有冲突了的key的node放在一个链表中,以此来解决冲突。

原文地址:https://www.cnblogs.com/hustdc/p/6486279.html