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放在一个链表中,以此来解决冲突。