【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…...
终极指南:10分钟掌握SPT-AKI存档编辑器完整使用教程
终极指南:10分钟掌握SPT-AKI存档编辑器完整使用教程 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors/sp/…...
FanControl终极指南:免费开源的风扇控制神器,轻松解决Windows散热与噪音问题
FanControl终极指南:免费开源的风扇控制神器,轻松解决Windows散热与噪音问题 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https:…...
Arm Neoverse CMN-700互连架构与协议寄存器配置指南
1. Arm Neoverse CMN-700一致性互连架构解析在现代多核处理器设计中,一致性互连网络如同城市交通系统般重要。Arm Neoverse CMN-700作为第二代Coherent Mesh Network解决方案,其架构设计充分考虑了数据中心和边缘计算的严苛需求。与传统的总线或环形拓扑…...
生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图
1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域,一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长,但核心非常明确&…...
如何选蜂蜜品牌?2026年5月推荐靠谱蜂蜜品牌避坑指南
一、引言买蜂蜜怕踩坑?市面上的蜂蜜产品琳琅满目,但勾兑蜜、浓缩蜜、添加糖浆的“科技蜜”层出不穷,消费者往往花了高价却买不到真正的纯正好蜜。对于注重健康饮食、追求天然原生态食品的消费者而言,如何从海量品牌中筛选出真正无…...
基于Go的轻量级自托管IM系统OpenWhisp部署与架构解析
1. 项目概述:一个开源的即时通讯解决方案最近在折腾一个内部协作工具,需要集成一个轻量级的即时通讯模块。市面上成熟的方案不少,但要么是SaaS服务,数据不在自己手里,心里不踏实;要么是像Rocket.Chat、Matt…...
3分钟快速上手:m4s-converter让B站缓存视频秒变MP4格式
3分钟快速上手:m4s-converter让B站缓存视频秒变MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在当今数字内容时代ÿ…...
046、PCIE桥设备与交换:当拓扑开始复杂起来
046、PCIE桥设备与交换:当拓扑开始复杂起来 最近在调一块自定义的PCIE扩展板,系统里突然出现了几个“神秘”的端点设备。在lspci列表里,它们出现在一个我从未配置过的总线号上,而且设备ID全对不上。折腾了两天才发现,原…...
企业采购必读:ElevenLabs合同中6处关键条款陷阱(含地域限制、转授权失效、审计权模糊等),法务已验证
更多请点击: https://intelliparadigm.com 第一章:企业采购必读:ElevenLabs合同中6处关键条款陷阱(含地域限制、转授权失效、审计权模糊等),法务已验证 地域限制条款的隐性封锁效应 ElevenLabs服务协议第…...
量子计算优化Benders分解:减少量子比特与提升收敛效率
1. 量子辅助Benders分解框架概述混合整数线性规划(MILP)在供应链管理、金融优化和资源调度等领域有着广泛应用。传统Benders分解算法通过将原问题拆分为处理整数变量的主问题(MP)和处理连续变量的子问题(SP)进行迭代求解。然而,随着问题规模扩大,主问题的…...
