STL源码剖析

前言,对STL学习的总结

1.type_traits相关技术比较简单,略过

2.空间配置器allocator的分析见

https://www.cnblogs.com/XDU-mzb/p/14849837.html

3.配接器,仿函数、算法部分也不讲,比较简单

目录

1.deque

2.hash_table

3.AVL-tree

4.RB-tree

1.deque

deque的实现十分的复杂,但是原理相当直观易懂
单纯的需要双端队列 + 随机访问的功能,直接vector实现一个环形队列即可

deque的优点

1.不进行对象的移动、拷贝,也就是每一个对象的地址,在push之后不改变
2.vector在平均情况下性能好,deque在最坏情况下性能好,deque的常数比较大
3.可以卡空间,空间利用率比较高,pop_back之后会释放空间,vector pop_back之后不自动释放空间
4.push_back/push_front是O(1),比vector的均摊O(1)快

迭代器


一张图,基本说明白了deque的迭代器是怎么工作的

map-中控器-一个二级指针

实际上就是实现了一个两倍增长的vector,每次扩容的时候,把老map挪动到新map的中间即可
push_back/front会引起迭代器失效,但是迭代器在不跨缓冲区操作的时候,还是有效的
因为push_back/front只会引起map的变化,但是迭代器中的其他三个指针还是有效的
特别是,一个失效的迭代器,依然大概率能正确的取值操作

2.hash_table

两种实现方法

1.开链法 + forward_list
2.二次探测(STL源码剖析中说,如果装载因子不超过0.5,那么期望常数次就能找到一个空桶,性能相当好)

迭代器


一个让我非常迷惑的地方就是为什么不滋滋双向迭代器...后来想了想,可以滋滋,但是没必要,因为元素是无序的
迭代器前进 : 若该迭代器的下个forward_list节点存在,则到下一个forward_list节点,否则,计算一下当前元素的val
,并暴力跳到下一个forward_list...
我以为有什么奇妙的优化...就是暴力跳下一个...

3.AVL-tree

AVL-tree和RB-tree

搜索的次数远远大于插入和删除,选择AVL树;搜索、插入、删除次数几乎差不多,选择红黑树

相对于AVL树来说,红黑树牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树

红黑树的平均统计性能优于AVL树,实际应用中更多选择使用红黑树

AVL平衡树的规则

平衡树的基本操作左转百度,这里主要分析平衡树的插入,删除,平衡规则的分析和维护
每个节点的左右儿子都是平衡树,并且左右儿子深度的差不超过1,树高O(1.44 * logn)

左旋右旋

posted @ 2021-06-26 22:11  XDU18清欢  阅读(228)  评论(0)    收藏  举报