• STL容器(vector、array、list、deque、set 、map 、stack、queue、priority_queue)的底层实现


    STL数据结构整体介绍:
    在这里插入图片描述

    一、vector

    1、底层数据结构: 数组
    2、内存分配位置: 堆上
    3、特点:

    • 支持快速随机访问
    • 扩容机制:vector 是动态数组,动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。

    二、array

    1、底层数据结构: 数组
    2、内存分配位置: 栈上
    3、特点:

    • 定长数组,不支持动态扩容。

    三、list

    1、底层数据结构: 双向链表
    2、内存分配位置: 堆上
    3、特点:

    • 支持快速增删,对于任何位置的元素插入或元素移除,永远是常数时间;

    四、deque

    1、底层数据结构: 是一种双向开口的连续线性空间,可以看作是list和vector的结合品(每个堆保存几个元素,然后堆和堆之间有指针连接)
    2、内存分配位置: 堆上
    3、特点:

    • deque 采用一块所谓的 map 作为主控。这里的 map 是一小块连续空间,其中每个元素都是指针,指向另一段连续线性空间,称为缓冲区缓冲区才是 deque 的存储空间主体。( 底层数据结构为一个中央控制器和多个缓冲区)
    • deque没有所谓容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接在一起。换句话说,像 vector 那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在 deque 是不会发生的。

    五、set 和 multiset

    1、底层数据结构: 红黑树/平衡二叉搜索树(RB-tree)
    2、内存分配位置: 堆上
    3、特点:

    • 所有元素都会根据元素的键值自动被排序
    • set键值不可重复,multiset可重复。

    六、map 和 multimap

    1、底层数据结构: 红黑树/平衡二叉搜索树(RB-tree)
    2、内存分配位置: 堆上
    3、特点:

    • 所有元素都会根据元素的键值自动被排序
    • map 的所有元素都是 pair,同时拥有实值(value)和键值(key)。
    • map不允许两个元素拥有相同的键值,multimap允许。

    七、unordered_map/ unordered_set/ unordered_multiset/ unordered_multimap

    1、底层数据结构: 哈希表(哈希桶算法)
    2、内存分配位置: 堆上
    3、特点:

    • 所有元素不会排序,但也与插入顺序不同,按hash值插入不同位置

    关联容器详见:关联容器底层数据结构:unordered_map/set基于hash表,不保证插入顺序;map/set基于红黑树,根据键自动排序

    八、stack

    1、底层数据结构: 一般用 list 或 deque 作为底部结构,封闭头部即可。不用 vector 的原因是容量大小有限制,扩容耗时。
    2、内存分配位置: 堆上
    3、特点:

    • 符合“先进后出”。

    九、queue

    1、底层数据结构: 以 deque 为底部结构并封闭其底部的出口和前端的入口
    2、内存分配位置: 堆上
    3、特点:

    • 是一种先进先出(First In First Out,FIFO)的数据结构。

    十、heap处理规则

    1、底层数据结构: vector
    2、内存分配位置: 堆上

    十一、priority_queue

    1、底层数据结构: 以vector为底层容器,再加上 heap 处理规则
    2、内存分配位置: 堆上
    3、特点:

    • priority_queue 是一个拥有权值观念的 queue。
    • 其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。

    vector、list、dequeue三者的选用原则:

    1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector;
    2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list;
    3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

    参考资料:

    1、C++ 学习笔记:STL 容器一些底层机制
    2、C++ STL 几个容器的底层实现 收藏一下

  • 相关阅读:
    JZ23 链表中环的入口结点
    【小白友好】LeetCode 删除并获得点数
    vue3接口封装 亲测有效
    slf4j简介说明
    Python——ASCII编码与Unicode(UTF-8,UTF-16 和 UTF-32)编码
    【面向对象】【0x01】 对象属性操作
    Python数据分析培训班介绍
    【优化算法】鹈鹕优化算法(POA)(Matlab代码实现)
    在Visual Studio中查看C项目使用的C语言版本
    《MATLAB 神经网络43个案例分析》:第33章 模糊神经网络的预测算法——嘉陵江水质评价
  • 原文地址:https://blog.csdn.net/qq_33726635/article/details/126525910