【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…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
