开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
STL容器实现原理
1.map实现原理map内部实现了一个红黑树,红黑树有自动排序的功能,因此map内部所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找、删除、添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉树存储的,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值。
2.hashtable(也称散列表,直译作哈希表)实现原理hashtable采用了函数映射的思想记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。这决定了哈希表特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。
3.deque实现原理(空间是分段的)
deque内部实现的是一个双向队列。元素在内存连续存放。随机存取任何元素都在常数时间完成(仅次于vector)。所有适用于vector的操作都适用于deque。在两端增删元素具有较佳的性能(大部分情况下是常数时间)。
4.list实现原理list内部实现的是一个双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取。无成员函数,给定一个下标i,访问第i个元素的内容,只能从头部挨个遍历到第i个元素。
5.vector实现原理:
vector的数据安排及操作方式与array非常相似。两者的唯一差别在于空间运用的灵活性。
array是静态空间,一旦配置好了就不能改变了,如果程序需要一个更大的array,只能自己再申请一个更大的array,然后将以前的array中的内容全部拷贝到新的array中。
vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新的元素。vector的关键技术在于对大小的控制以及重新分配时的数据移动效率。
vector在增加元素时,如果超过自身最大的容量,vector则将自身的容量扩充为原来的两倍。扩充空间需要经过的步骤:重新配置空间,元素移动,释放旧的内存空间。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了。
- vector采用一维数组实现,元素在内存连续存放,不同操作的时间复杂度为:插入: O(N)查看: O(1)删除: O(N)
- deque采用双向队列实现,元素在内存连续存放,不同操作的时间复杂度为:插入: O(N)查看: O(1)删除: O(N)
- list采用双向链表实现,元素存放在堆中,不同操作的时间复杂度为:插入: O(1)查看: O(N)删除: O(1)
- map、set、multimap、multiset上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种。不同操作的时间复杂度近似为:插入: O(logN)查看: O(logN)删除: O(logN)
- unordered_map、unordered_set、unordered_multimap、 unordered_multiset上述四种容器采用哈希表实现,不同操作的时间复杂度为:插入: O(1),最坏情况O(N)查看: O(1),最坏情况O(N)删除: O(1),最坏情况O(N)注意:容器的时间复杂度取决于其底层实现方式。 111