stl容器底层数据结构
时间: 2023-08-19 07:05:31 浏览: 61
STL容器的底层数据结构是数组。具体来说,当向器中添加元素时,如果容器已经满了,它会扩展空间为原来的2倍。当实际元素数量低于分配空间的1/4时,容器会将空间回收为原来的一半。这是通过先申请新的空间,然后将旧空间的内容拷贝过去,最后释放旧的空间来完成的。《STL源码剖析》一书中没有详细讲述空间的回收,这是我之前查找资料时了解到的信息。<span class="em">1</span>
#### 引用[.reference_title]
- *1* [STL各容器底层数据结构总结](https://blog.csdn.net/u014209688/article/details/90614074)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
相关问题
stl容器的底层实现的数据结构
stl容器的底层实现的数据结构是不同的,每个容器都有自己的底层数据结构。下面是一些常见的stl容器及其底层数据结构:
1. vector:底层使用动态数组实现,通过连续的内存块存储元素。
2. list:底层使用双向链表实现,每个节点包含元素值以及指向前一个和后一个节点的指针。
3. deque:底层使用分段连续的动态数组实现,通过多个连续的内存块存储元素。
4. map/set:底层使用红黑树(一种自平衡二叉搜索树)实现,通过节点存储键值对或单个元素,并按照键的顺序进行排序。
5. unordered_map/unordered_set:底层使用哈希表实现,通过哈希函数将键映射到桶(bucket),每个桶存储一个链表或红黑树。
6. stack/queue:这些容器通常是在vector、deque或list的基础上进行封装实现的,没有特定的底层数据结构。
STL底层数据结构的实现
STL(标准模板库)是C++的一个重要的标准库,它提供了许多数据结构和算法。STL中的容器包括vector、list、deque、set、map等,它们的底层数据结构不尽相同,下面是它们的底层数据结构的实现:
1. vector底层数据结构的实现:
vector实际上是一个动态数组,它是通过连续的内存空间来存储元素的。当元素数量超过当前内存容量时,vector会自动扩容并重新分配内存。在扩容时,vector会将原来的元素拷贝到新分配的内存空间中,并释放原来的内存空间。
2. list底层数据结构的实现:
list实际上是一个双向链表,它的每个节点包含了元素值、指向前一个节点和后一个节点的指针。在插入或删除元素时,只需要改变相邻节点的指针即可,不需要像vector那样重新分配内存空间。这使得list在插入或删除元素时效率更高。
3. deque底层数据结构的实现:
deque实际上是一个双端队列,它的内部维护了一段连续的内存空间,该内存空间被分为多个小块,每个小块内部是连续的。当需要在队列的头部或尾部插入或删除元素时,deque会在内存的两端分配或释放小块,以保持内存空间的连续性。
4. set和map底层数据结构的实现:
set和map实际上都是基于红黑树实现的。红黑树是一种自平衡的二叉搜索树,它具有良好的平衡性和插入/删除的高效性。在set和map中,每个元素都被视为一个节点,节点的值是元素的键(key),节点的指针指向左右子节点和父节点。通过红黑树的自平衡机制,保证了set和map的高效性和平衡性。
总之,STL中的容器底层数据结构的实现各有特点,每种数据结构都有适用的场景,程序员可以根据实际需求来选择合适的容器。