C++ STL(第十六篇:容器的总结)

版权声明:转载请说明来源 https://blog.csdn.net/weixin_39640298/article/details/89416143

1、总结

到这里,对于STL的容器就整理完成了。我们把容器分为了 序列式容器关联式容器,而每类下面又分为好多容器,如下图所示:
在这里插入图片描述
其中,有一些容器需要基于特定的结构或算法,如 priority-queue,set,map,hash_set;还有一些容器是对底层容器接口的修改,如 stack、queue。之前我只是整理了,他们的原理和代码,其实还差一些他们之间的比较及使用细节,这一节给补上。

2、注意事项

1、STL 底层都是基于拷贝的方式来工作的,任何需要放入STL中的元素,都会被复制。所以要使用STL的类一定要有拷贝构造的函数。对于占用内存很大的对象,为了减少复制带来的性能下降,最好使用指针来代替对象。

2、vector 容器,在插入、删除 和 扩容之后,其迭代器会失效

3、尽量使用区间成员函数代替单元素操作。这样会有更少的元素调用、元素移动和内存分配

4、遍历时,最好使用STL提供的接口,或算法,效率高且不易出错

3、AVL 和 RB-tree 的比较

AVL 树中任何节点的两个子树的高度最大差别为1,所以他也被称为高度平衡树。在查找、插入和删除在平均和最坏的情况下都是 O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。

RB-tree 是在二叉查找树上多了一个存储颜色的节点,颜色只能是红或者黑。根据遍历树时对颜色遍历来确保每个路径长不能超过其它路径长的2倍。RB-tree树并不追求 “完全平衡” ---- 它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。RB-tree 的插入和删除操作,都会在三次旋转之内解决 O( 1 )。但是查找不是完全平衡,性能比 AVL 树要稍差一点点。

所以可以总结为:在插入元素时,AVL 可能需要 O(log(N)) 操作来重新平衡树,而 RB-tree 只需要 O(1)。在搜索时 AVL 树更快一点。

4、hashtable

hashtable 其实可以看做是 数组 和 链表 两者特性的结合

数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。

在没有 “冲突” 节点的情况下,hashtable 查找只需要 O(1)。如果存在冲突,那么最坏的情况复杂度为 O(n)。所以说hashtable 在查询上时间复杂度不稳定。 RB-tree 树查找,在总查找效率上比不上 hashtable,但是它稳定,它的算法复杂度不会出现波动,最坏的情况下其复杂度为O(log2N)。

5、 其它

关系型数据库中,索引大多采用 B/B+ 树来作为存储结构,而全文搜索引擎的索引则主要采用hash的存储结构。

后面就整理 STL 的最后一个模块---- 算法了,STL 终于看到尽头了。

感谢大家,我是假装很努力的YoungYangD(小羊)

参考资料:
《STL源码剖析》
https://www.deeplearn.me/267.html
https://igaozh.iteye.com/blog/1678495
https://blog.csdn.net/wl044090432/article/details/54585765

猜你喜欢

转载自blog.csdn.net/weixin_39640298/article/details/89416143