STL源码剖析——容器

容器

在这里插入图片描述

序列式容器

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实现类似,但是不具备排序能力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值