C++ 常用STL底层原理

news2024/11/17 1:28:15

STL

1. std::vector

在这里插入图片描述

底层原理:std::vector 是一个动态数组。它在内存中分配一块连续的存储空间来存储元素。随着元素数量的增加,如果存储空间不够用,vector 会分配一块更大的内存,并将现有元素复制到新内存块中。通常,vector 的容量会按一定比例(通常是两倍)扩展,以减少频繁的内存分配和复制操作。
优点:快速的随机访问(O(1))、尾部插入和删除操作(均摊 O(1))。
缺点:当容量需要扩展时,可能会发生较慢的重新分配和元素复制。

内部结构示意

template <typename T, typename Allocator = std::allocator<T>>
class vector {
private:
    T* data;              // 指向元素存储区域的指针
    size_type size;       // 当前存储的元素数量
    size_type capacity;   // 当前分配的最大存储容量
    Allocator allocator;  // 用于管理内存的分配器

    // ...
};

2. std::list

在这里插入图片描述

底层原理:std::list 是一个双向链表。每个元素都存储在一个节点中,节点包含数据和指向前后节点的指针。链表的元素在内存中不需要是连续的,因此插入和删除元素非常高效(O(1)),但不支持快速随机访问(O(n))。
优点:高效的插入和删除操作,尤其是在中间位置。
缺点:较慢的随机访问,不适合需要频繁索引访问的场景。

内部结构示意

template<typename T>
struct Node {
    T data;        // 节点存储的数据
    Node* prev;    // 指向前一个节点的指针
    Node* next;    // 指向后一个节点的指针
};

template<typename T>
class list {
private:
    Node<T>* head;   // 指向链表的头节点
    Node<T>* tail;   // 指向链表的尾节点
    size_t size;     // 链表中的元素数量
    // 其他成员...
};

3. std::deque

在这里插入图片描述
deque内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据。
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间。
在这里插入图片描述

底层原理:std::deque(双端队列)实现为一组连续的小块内存(通常称为块或缓冲区),这些块通过指针数组连接在一起。deque 支持双端操作,因此可以在两端高效地插入和删除元素。随机访问的时间复杂度为 O(1)。
优点:快速的双端插入和删除、快速的随机访问。
缺点:相比 vector,内存占用略高,因为需要额外的指针来管理块。

内部结构示意

template <typename T, typename Allocator = std::allocator<T>>
class deque {
private:
    typedef T* pointer; // 定义指向元素的指针类型
    pointer* map;       // 内存块数组(map),存储指向每个内存块的指针
    // 头部和尾部指针
    pointer start;     
    pointer finish;    

    size_t map_size;     // 当前容量和块的大小
    static const size_t block_size = 512; // 内存块大小
    Allocator allocator; // 分配器,用于分配内存
}

4. std::stack

在这里插入图片描述

底层原理:std::stack 是一种适配器容器,通常基于 std::deque 或 std::vector 实现。它提供了一种后进先出(LIFO)的数据结构,支持 push、pop、top 等操作。
优点:简单的 LIFO 操作,底层实现可以灵活选择。
缺点:只提供有限的接口,无法遍历或随机访问。

5. std::queue

在这里插入图片描述

底层原理:std::queue 是一种适配器容器,通常基于 std::deque 实现。它提供了一种先进先出(FIFO)的数据结构,支持 push(入队)、pop(出队)、front(获取队头)等操作。
优点:简单的 FIFO 操作,底层实现可以灵活选择。
缺点:只提供有限的接口,无法遍历或随机访问。

6. std::priority_queue

底层原理:std::priority_queue 通常使用 std::vector 作为底层容器,并基于二叉堆(通常是最大堆)实现。它允许你高效地访问并删除优先级最高的元素(通常是最大元素)。
优点:支持高效的最大或最小值访问,插入和删除操作的时间复杂度为 O(log n)。
缺点:随机访问和遍历效率低,不适合频繁需要全部元素排序的场景。

7. std::set 和 std::multiset

底层原理:std::set 和 std::multiset 通常基于红黑树实现。红黑树是一种自平衡二叉搜索树,能够保证基本操作(插入、删除、查找)的时间复杂度为 O(log n)。std::set 存储唯一元素,而 std::multiset 允许重复元素。
优点:高效的查找、插入和删除操作,元素自动排序。
缺点:相比于 unordered_set,性能稍差,内存占用稍高。

8. std::map 和 std::multimap

底层原理:std::map 和 std::multimap 也基于红黑树实现。它们存储的是键值对(key-value),std::map 中的键是唯一的,而 std::multimap 允许相同的键出现多次。
优点:高效的键查找、插入和删除操作,键值对按键自动排序。
缺点:相比于 unordered_map,查找和插入性能稍差,内存占用稍高。

部分内部结构示意

template<typename Key, typename T>
struct Node {
    std::pair<const Key, T> data;  // 键值对
    Node* parent;                  // 指向父节点的指针
    Node* left;                    // 指向左子节点的指针
    Node* right;                   // 指向右子节点的指针
    bool color;                    // 节点颜色(红或黑)
};

9. std::unordered_set 和 std::unordered_map

底层原理:std::unordered_set 和 std::unordered_map 基于哈希表实现。哈希表使用哈希函数将键映射到桶中,从而实现常数时间复杂度(O(1))的查找、插入和删除操作。
优点:非常高效的查找、插入和删除操作,适合不需要排序的场景。
缺点:键的顺序不固定,容易受到哈希冲突的影响,性能可能不如红黑树稳定。

10. std::unordered_multiset 和 std::unordered_multimap

底层原理:与 std::unordered_set 和 std::unordered_map 类似,但允许存储重复的元素(unordered_multiset)或重复的键(unordered_multimap)。
优点:与 unordered_set 和 unordered_map 类似,提供高效的查找、插入和删除操作,允许重复元素或键。
缺点:键的顺序不固定,容易受到哈希冲突的影响。

vector 动态数组,list 双向链表,deque 双端队列,stack 栈, queue 队列, map 红黑树(键值对), set 红黑树(不允许元素重复)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2049430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript模块化——JS模块化介绍与CommonJS规范

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;vscode Chrome浏览器 目录 1.模块化概述 1.1什么是模块化 1.2为什么需要模块化 1.2.1全局污染 1.2.2依赖混乱 1.2.3数据安全 2.有哪些模块化规范 3.导入与导出 3.1导入 3.…

YOLOV5单目测距+车辆检测+车道线检测+行人检测(教程-代码)

YOLOv5是一种高效的目标检测算法&#xff0c;结合其在单目测距、车辆检测、车道线检测和行人检测等领域的应用&#xff0c;可以实现多个重要任务的精确识别和定位。 首先&#xff0c;YOLOv5可以用于单目测距。 通过分析图像中的目标位置和尺寸信息&#xff0c;结合相机参数和几…

React原理之Fiber详解

前置文章&#xff1a; React原理之 React 整体架构解读React原理之整体渲染流程 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 &#x1f60a;----- 在React原理之 React 整体架构解读中&#xff0c;简单介绍了 Fiber 架构&#xff0c;也了解了 Fiber 节点的…

一个云端应用市场和配套的移动办公APP,支持iOS和Android端,可私有部署,支持在线体验(附源码)

前言 在当前的企业应用市场中&#xff0c;许多移动办公软件不仅成-本高昂&#xff0c;而且在功能对接和接口完整性方面存在不足&#xff0c;导致开发成本居高不下。这促使企业和开发者寻求更加经济、高效且功能丰富的处理方案。 介绍 O2OA&#xff08;翱途&#xff09;开发平…

【15】大数据题目等

目录 一.大数据题目的解题技巧​编辑 二.找重复的URL 三.利用小内存找出所有出现两次的数。 四.位运算题目 五.面试原题 六,.判断一个32位正数是不是2的幂&#xff0c;4的幂 七.位运算实现加减乘除 加法 减法 乘法 除法 一.大数据题目的解题技巧 二.找重复的URL 方法…

uni-app--》打造个性化壁纸预览应用平台(一)

&#x1f3d9;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名前端工程师 &#x1f304;个人主页&#xff1a;亦世凡华、 &#x1f306;系列专栏&#xff1a;uni-app &#x1f307;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

linux更换为阿里云的yum下载镜像源

更换镜像源 1.备份&#xff1a; sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.创建一个文件: cd /etc/yum.repos.d/ touch CentOS-Base.repo 3.往CentOS-Base.repo添加内容 vi CentOS-Base.repo 添加以下内容&#xff1a; [base…

vue3 组合式 API:setup()

查看vue3官网介绍&#xff1a;组合式 API&#xff1a;setup() 在 Vue 3 中&#xff0c;组合式 API 的 setup() 函数是一个非常重要的特性&#xff0c;它提供了一种更灵活和可维护的方式来组织组件的逻辑。 基本概念 setup() 函数是在组件实例创建之前执行的&#xff0c;它用于…

重复玩一个游戏就是自闭症吗?自闭的特征有哪些?

重复玩一个游戏并不一定是自闭症的标志。儿童在成长过程中&#xff0c;有时会因为对某个游戏或活动的喜爱而反复进行&#xff0c;这是他们探索世界、发展兴趣和技能的一种方式。然而&#xff0c;如果这种行为伴随着其他自闭症的典型特征&#xff0c;如语言障碍、社交障碍和兴趣…

C语言 ——— 修改默认对齐数以及结构传参

目录 前言 修改默认对齐数 结构体传参 前言 在上一篇中&#xff0c;有讲解到结构体内存对齐的规则以及默认对齐数 C语言 ——— 结构体内存对齐-CSDN博客 修改默认对齐数 修改默认对齐数所需要的宏命令&#xff1a;#pragma 代码演示&#xff1a; #pragma pack(1) // 将默…

MVCC工作原理深入解析

一、事务概述 mysql事务是指一组命令操作&#xff0c;在执行过程中用来保证要么全部成功&#xff0c;要么全部失败。事务是由引擎层面来支持的&#xff0c;MyISM引擎不支持事务&#xff0c;InnoDB引擎支持事务。 事务具有ACID四大特性 原子性&#xff08;Atomicity&#xff0…

XSS靶场(1-11关)

目录 简述xss xss第1关 xss第2关 ​编辑 xss第3关 xss第4关 xss第5关过滤了 on script xss第6关 xss第7关 xss第8关 xss第9关 xss第10关 xss11关 我把源代码靶场放到了最顶端 简述xss XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法…

【数据结构与算法 | 图篇】最小生成树之Prim算法

1. 前言 普里姆算法&#xff08;Prims Algorithm&#xff09;是一种用于寻找加权无向图中的最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;的贪心算法。 最小生成树是指对于一个给定的无向图&#xff0c;连接所有顶点且边的总权重最小的生成树。 2. 算法步骤 …

Spring Boot 核心配置

一、 Spring Boot配置文件分类 SpringBoot是基于约定的&#xff0c;所以很多配置都有默认值&#xff0c;但如果想使用自己的配置替换默认配置的话&#xff0c;就可以使用application.properties或者application.yml&#xff08;application.yaml&#xff09;进行配置 applicat…

外贸市场开发【越南】

​作为“新兴之秀” 越南的经济发展可谓是突飞猛进 并在2022年&#xff0c;成为全亚洲经济增长最快速经济体 经济的增长也让越南的地位变得不一样了 一起来看看外贸人聚焦的东南亚排名前五的越南 越南社会主义共和国&#xff0c;通称越南&#xff0c;是位于东南亚的中南半岛…

谷粒商城实战笔记-213-商城业务-认证服务-整合短信验证码服务

文章目录 一&#xff0c;开通阿里云云市场短信服务1&#xff0c;阿里云开通免费短信服务并调试2&#xff0c;整合短信服务2.1 下载HttpUtils代码2.2 开发调用短信服务的组件2.3 测试 HttpUtils代码 这一节主要内容是整合短信发送服务。 一&#xff0c;开通阿里云云市场短信服务…

多输入多输出 | Matlab实现CPO-BP冠豪猪优化算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现CPO-BP冠豪猪优化算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现CPO-BP冠豪猪优化算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现CPO-BP冠豪猪优化…

CUDA-MODE课程笔记 第6课: 如何优化PyTorch中的优化器

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode CUDA-MODE课程笔记 第6课: 如何优化PyTorch中的优化器 课程内容 上面三张Slides讲述了运行时间&#xff08;runtime&#xff09;和内存使用&…

ChatGPT 3.5/4.0 新手使用手册(详细版)

1. 什么是 ChatGPT&#xff1f; ChatGPT是由 OpenAI 开发的先进人工智能语言模型&#xff0c;能够理解并生成自然语言文本。它可以帮助你进行写作、回答问题、提供建议&#xff0c;甚至参与对话。ChatGPT 3.5 和 4.0 是两个不同版本&#xff0c;它们都拥有强大的语言处理能力&…

sublime text 4 安装(含激活码)安装破解汉化 Sublime Text 4 的操作指南

sublime text 4 安装&#xff08;含激活码&#xff09; 一、下载步骤 官网地址&#xff1a;Sublime Text - the sophisticated text editor for code, markup and prosehttps://link.zhihu.com/?targethttps://www.sublimetext.com/ windows下载链接&#xff1a;Thank You -…