【C++STL】STL容器详解
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言内容💖:
专栏:c语言之路重点知识整合
【c语言】全部知识点总结
目录
- Vector
- List
- vector 与 list 的区别
- Deque
- deque与vector的区别
- Map
- Set
- 总结
STL(Standard Template Library, 标准模板库),STL 库中几乎所有的代码都使用了模板类或模板函数,建立了数据结构和算法的一套标准,实现了代码的 复用性。
STL 六大组件:
- 容器(Container):存储数据
- 算法(Algorithm):操作数据
- 迭代器(Iterator):借助迭代器操作容器数据
- 仿函数(Function object):为算法提供更多策略
- 适配器(Adaptor):为算法提供更多参数的接口
- 空间配置器(allocator):动态分配、管理空间
容器中可以分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。
序列性容器:容器内元素位置保持插入元素的原始顺序
- Vector
- List
- Deque
关联性容器:元素位置与插入顺序无关(取决于排序规则),容器自动申请、释放内存
- map
- set
- hash_map
Vector
动态数组,里面有一个指针指向一片连续的内存空间,与数组的差别在于对空间利用的灵活性。
vector 中删除数据时,vector 的容量不变;扩容时可能导致迭代器失效
扩容:
- 1.申请新空间
- 2.拷贝数据到新空间
- 3.释放原空间
#include <vector>
using namespace std;
class Vector
{
Protected:Iterator start; //表示目前使用空间的头Iterator finish; //表示目前使用空间的尾Iterator end_of_storage; //表示目前可用空间的尾
Public:Iterator begin(); //获取头元素迭代器Iterator end(); //获取尾元素迭代器Reference front(); //返回首元素的值Reference back(); //返回尾元素的值Size_type size(); //返回使用空间的大小Size_type capacity(); //返回容量的大小void push_back(const T& x); //将元素插入到最尾端void pop_back(); //将最尾端的元素取出Iterator erase(iterator position);//清除某位置上的元素,返回下一节点迭代器void insert(位置,数值); //在某个位置插入多少个元素void clear(); //清除所有元素
};
List
双向循环链表,List 在任何位置添加删除效率都为 O(1),查找效率为 O(n)
#include <list>
using namespace std;
class List
{
Protected:Iterator start; //链表头节点Iterator finish; //链表尾节点
Public:Iterator begin(); //获取头节点迭代器Iterator end(); //获取尾节点迭代器Reference front(); //返回头节点的值Reference back(); //返回尾节点的值void push_front(const T &x); //插入一个结点,作为头结点void push_back(const T &x); //插入一个结点,作为尾结点void pop_front(); //移除头结点void pop_back(); //移除尾结点void remove(const T&value); //将数值为value的所有元素移除void unique(); //将“连续而相同的元素”移除只剩一个Iterator erase(iterator position);//清除某位置上的元素,返回下一节点迭代器Iterator insert(iterator position); //在指定位置插入元素,返回插入元素迭代器void clear(); //清除所有元素void sort(); //将list 的元素进行升序排序bool empty(); //查看链表是否为空int size(); //返回链表长度(元素个数)void reverse(); //翻转链表
};
vector 与 list 的区别
- 1.vector 顺序存储,list 链式存储
- 2.vector 支持快速访问 O(1),插入删除效率低 O(n);list 访问性能差 O(n),支持快速插入删除 O(1)
- 3.vector 先分配内存不够再扩容,list 插入新节点就要申请新内存
Deque
双端队列,可以在头尾两端分别做元素的插入和删除操作。支持 [] 下标访问。
deque采用类似索引的结构管理内存:采用一块map作为主控,其为一小块连续空间,其中每个元素都是指针,指向另一段较大的连续空间(缓冲区)
deque的迭代器包含4个内容:
1)cur:迭代器当前所指元素
2)first:此迭代器所指的缓冲区的头。
3)last:缓冲区尾。
4)node:指向管控中心。
#include <deque>
using namespace std;
class Deque
{
Protected:Iterator start; //首元素Iterator finish; //尾元素
Public:Iterator begin(); //获取头元素迭代器Iterator end(); //获取尾元素迭代器Reference front(); //返回首元素的引用Reference back(); //返回尾元素的引用Size_type size(); //返回deque的长度大小void push_front(const T &x); //将元素插入到头部void push_back(const T& x); //将元素插入到最尾端void pop_front(); //移除头结点void pop_back(); //将最尾端的元素取出Iterator erase(iterator position);//清除某位置上的元素void insert(位置,数值); //在某个位置才插入多少个元素void clear(); //清除所有元素void resize(); //重新设置deque的长度大小
};
deque与vector的区别
- 1.vector是单向开口的连续线性空间,deque是双向开口的连续线性空间
- 2.deque 的迭代器更复杂
Map
所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。Pair的第一元素被视为键值,第二元素被视为实值。Map 不允许两个元素拥有相同的键值。
查找效率:O( l o g 2 n log_2n log2n)
#include <map>
using namespace std;
class Map
{iterator find(key); //查找指定键值map的迭代器pair<string,int> pairTemp(string(“A”),5); //pair的构造函数iterator insert(iterator position, pairTemp); //将pairTemp 插入到map 中void erase(iterator position); //删除指定位置上的 map 元素size_type count(key); //判断该键值的Map 元素是否存在size_type size(); //返回map 中的元素的个数iterator lower_bound(key); //返回该键值或者大于该键值的map 的迭代器iterator upper_bound的(key); //返回大于该键值的map 的迭代器
};
元素较少时使用 map(底层:红黑树)
元素很多时使用 hash_map(底层:哈希表)
Set
所有元素都会根据元素的键值自动被排序,Set 的元素不像Map那样可以同时拥有实值和键值,Set 元素的键值就是实值,实值就是键值。Set 不允许两个元素有相同的键值。
查找效率:O( l o g 2 n log_2n log2n)
#include <set>
using namespace std;
class Set
{iterator find(key); //查找指定键值map的迭代器pair<string,int> pairTemp(string(“A”),5); //pair的构造函数iterator insert(iterator position, pairTemp); //将pairTemp 插入到map 中void erase(iterator position); //删除指定位置上的 map 元素size_type count(key); //判断该键值的Map 元素是否存在size_type size(); //返回map 中的元素的个数iterator lower_bound(key); //返回该键值或者大于该键值的map 的迭代器iterator upper_bound的(key); //返回大于该键值的map 的迭代器
};
总结
| 容器 | 底层实现 | 描述 | 包含头文件 |
|---|---|---|---|
| 向量vector | 数组,快速访问 | 可以在O(1) 时间内访问和修改任意元素,在序列尾部进行插入和删除时,具有 O(1)时间复杂度,对任意项的插入和删除就有的时间复杂度较高,尤其对向量头的添加和删除开销非常高 | <vector> |
| 双端队列deque | 一个中央控制器和多个缓冲区 | 基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作时间复杂度也为 O(1) | <deque> |
| 表list | 双向链表,快速增删 | 对任意元素的访问时间复杂度为 O(n),支持快速插入删除 O(1) | <list> |
| 队列queue | list 或 deque | 先进先出 | <queue> |
| 堆栈stack | list 或 deque | 先进后出 | <\stack> |
| 集合set | 红黑树,不可重复 | 由节点组成的红黑树,每个节点都包含着一个元素,具有快速查找的功能,插入删除操作效率低 | <set> |
| 多重集合multiset | 红黑树,有序,可重复 | 和 set 基本相同,但可以支持重复元素具有快速查找能力 | <set> |
| 映射map | 红黑树,有序,不可重复 | 由{键,值}对组成的集合,具有快速查找能力 | <map> |
| 多重映射 multimap | 红黑树,有序,可重复 | 与 map 相比,一个键可以对应多个值,具有快速查找能力 | <map> |
| 哈希表 hash_map | 哈希表,无序,不可重复 | 增删查时间复杂度都是O(1) | <hash_map>/<unordered_map> |
| 多重哈希 hash_multimap | 哈希表,无序,可重复 | 增删查时间复杂度都是O(1) | <hash_map>/<unordered_map> |

| 大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
| 大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |
相关文章:
【C++STL】STL容器详解
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c系列专栏:C/C零基础到精通 🔥 给大…...
缓存篇—缓存雪崩
什么是缓存雪崩 通常我们为了保证缓存中的数据与数据库中的数据一致性,会给 Redis 里的数据设置过期时间,当缓存数据过期后,用户访问的数据如果不在缓存里,业务系统需要重新生成缓存,因此就会访问数据库,并…...
力扣日记2.22-【回溯算法篇】47. 全排列 II
力扣日记:【回溯算法篇】47. 全排列 II 日期:2023.2.22 参考:代码随想录、力扣 47. 全排列 II 题目描述 难度:中等 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输…...
如何理解三大微分中值定理
文章看原文,自己写的只是备份 高等数学强化2:一元函数微分学 中值定理 极值点 拐点_一元函数中值定理-CSDN博客 高等数学强化3:一元函数积分学 P积分-CSDN博客 高等数学强化3:定积分几何应用-CSDN博客...
Linux--自定义shell
shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口,用户可以通过输入命令来执行各种操作,如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…...
AIGC 实战:Ollama 和 Hugging Face 是什么关系?
Ollama和 Hugging Face 之间存在着双重关系: 1. Ollama是 Hugging Face 开发并托管的工具: Ollama是一个由 Hugging Face 自行开发的开源项目。它主要用于在本地运行大型语言模型 (LLM),特别是存储在 GPT 生成的统一格式 (GPT-Generated Un…...
Gitee教程2(完整流程)
1.配置git git config --global user.name "用户名" git config --global user.email "密码" 如何获取? gitee右上角加号点击新建仓库,仓库名随便起一个就行 找到这条命令,把这两句一个一个复制到vscode终端就行 2.创建g…...
Go 1.22 中的 for 循环新特性详解
目录 每次迭代都创建新变量 支持整数类型循环 小结 在 Go 语言中,for 循环是实现迭代的主要方式。Go 中的 for 循环非常灵活,有多种使用方式,包括传统的三部分 for 循环、类似于其他语言中的 while 循环以及迭代集合的 range 循环。 在 1…...
igolang学习2,golang开发配置国内镜像
go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct...
R语言空间分析、模拟预测与可视化
随着地理信息系统(GIS)和大尺度研究的发展,空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用,其中在空间分析方面扮演着重要角色,与空间相关的包的数量也达到130多个。在本…...
体育赛事直播系统软件开发
体育赛事直播系统的软件开发是一个复杂的项目,需要多个方面的准备和工作。以下是开发这样一个系统可能涉及的主要步骤和考虑因素: 需求分析和规划:首先需要明确系统的功能需求,包括直播视频的流媒体处理、用户管理、直播赛事安排…...
使用 kind 集群安装运行极狐GitLab Runner【上】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 关于 kind kind 是一个用来运行本地 Kubernetes 机群的工具&a…...
wine 源码 vk3d wine-gecko wine-mono 各版本 国内下载地址 中国科技技术大学源
下载地址 Index of /wine/...
【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)
文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…...
jquery简介与解析
jQuery是一款流行的JavaScript库,旨在简化客户端脚本编写。它针对DOM操作、事件处理、动画效果和AJAX交互提供了简洁高效的解决方案,使得开发者能够更加便捷地创建交互式网页。 // jQuery小插件:给带有highlight类的元素添加鼠标悬停效果 (fu…...
Apache Commons开源的工具库介绍
Apache Commons 是 Apache 软件基金会主持的一个项目,旨在提供一系列可重用的 Java 组件。这些组件覆盖了从数据封装、文本处理到网络通信等各个方面,是 Java 开发中常用的一系列工具库。Apache Commons 项目下的各个库通常以 "commons-" 开头…...
SQL语法法则
概念 SQL语法规则:SQL是一种结构化编程语言 基础SQL指令通常是以行为单位 SQL指令需要语句结束待,默认是英文分号:;、\g、\G SQL指令类似自然语言 编写的SQL中如果用到了关键字或者保留字,需要使用反引号、来包裹,让系统忽略 …...
Java命令模式:让请求成为对象
Java命令模式:让请求成为对象 在软件设计中,我们经常遇到需要将操作或请求封装成对象的情况。这样,我们可以将它们作为参数传递、排队、记录或撤销。命令模式正是为了满足这种需求而诞生的。在命令模式中,一个请求或操作被封装成…...
研究生摆烂摆烂的一个寒假
寒假:27-24,不到一个月 刚回家,不想学习,摆烂 想学了,又过年了,于是又开摆 又想学了,家里面有有点小事,于是又开摆 摆完,没想到就返校啦 期末作业没完成(…...
singularity-ce-4.1.0 + go 完整安装步骤,及报错解决
singularity-ce-4.1.0 + go 1.20 完整安装步骤. 解决bug: checking: host Go compiler (at least version 1.13)... not found! mconfig: could not complete configuration服务器基础环境: 阿里云服务器: => lsb_release -a LSB Version: :core-4.1-amd64:core-4.1-n…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
