容器
序列式容器
vector
vector的迭代器是random_iterator
vector一旦引起capacity变大,即end_of_storage变化,则会将整个vector进行空间的重新配置,原来的迭代器将全部失效
list
list容器不仅是一个双向链表,而且还是一个环形链表,提供的迭代器为bidirection_iterator
list的sort不接受STL算法的sort,因为STL算法的sort只接收randomaccess iterator,list只能使用自己的sort,因为其迭代器为bidirectional iterator
deque
deque采用randomaccess iterator迭代器
stack
stack以缺省的deque作为底部结构来实现,stack因为没有遍历的能力和需求,所以不提供迭代器,因为其具有“修改某物接口,而形成另一种风貌”,所以一般不称之为容器,称之为配接器
queue
queue也以缺省的deque作为底层结构来实现,queue也没有遍历的能力和需求,所以同样不提供迭代器,同stack,也称之为配接器
heap
heap处理规则,对于插入,在末尾插入一个数,让其与父节点比较,大于则换位,小于不变;对于删除,将根结点直接pop,然后从其左右两个孩子找一个补上来,然后再将最后一个数补到空位上然后进行向下的比较换位
priority_queue
priority_queue以vector作为底部容器,配以heap处理规则所实现,priority_queue也是配接器
slist
单向链表,与list区别在于其迭代器为forward iterator
关联式容器
AVL树
AVL树对于外侧的不平衡会采用单旋的方式达到平衡,对于内侧的不平衡会采用双旋的方式来达到平衡
RB tree
set
使用set自带的find算法效率更高,因为充分利用了二叉搜索树的特性,而algorithm中的find是顺序搜索,set跟list类似,在删除其某个结点后,只有该结点对应的迭代器失效,而不会影响其他的迭代器,set的迭代器是const iterator,所以不可以修改其值
map
map与set基本同理,只不过map多了一个value值,对于他的迭代器来说不可改变其key,理由同set,可以改变key对应的value值,map的迭代器既不是const iterator也不是mutable iterator,在map中新增和删除结点都不影响其他迭代器,只有被删除的迭代器会失效,map也是使用自带find函数会比algorithm中的find块
multiset和multimap
与set和map的区别只在于采用的插入是RB tree的insert_unique()和insert_equal()的区别
hashtable
线性探测
二次探测
不是寻找H+1,H+2……,而是寻找H+1^2 ,H+2^2……
开链法
hashtable采用开链法来实现哈希表,其bucket聚合体以vector来实现,以便于动态扩展,hashmap只为int、char、long做了相对应的hash function,对于double/string/float等需要自己定义hash function,hashtable的copy函数是深拷贝
布隆过滤器
求多个哈希函数得出来的结果放置在位图中,当所有位图所处位置相同时才为命中
hash衍生
整个hash table是由vector和linked list实现的,hash table的大小扩容并不是按2倍扩大,而是有一列STL内定的质数,按此质数扩容
hash set(unordered_set)、hash map(unordered_map)、hash multimap(unordered_multimap)、hash multiset(unordered_multiset)都是基于hashtable进行实现的,跟上面的map这些以RB tree实现类似,但是不具备排序能力