当前位置: 首页 > news >正文

【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>
队列queuelist 或 deque先进先出<queue>
堆栈stacklist 或 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容器详解

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…...

缓存篇—缓存雪崩

什么是缓存雪崩 通常我们为了保证缓存中的数据与数据库中的数据一致性&#xff0c;会给 Redis 里的数据设置过期时间&#xff0c;当缓存数据过期后&#xff0c;用户访问的数据如果不在缓存里&#xff0c;业务系统需要重新生成缓存&#xff0c;因此就会访问数据库&#xff0c;并…...

力扣日记2.22-【回溯算法篇】47. 全排列 II

力扣日记&#xff1a;【回溯算法篇】47. 全排列 II 日期&#xff1a;2023.2.22 参考&#xff1a;代码随想录、力扣 47. 全排列 II 题目描述 难度&#xff1a;中等 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输…...

如何理解三大微分中值定理

文章看原文,自己写的只是备份 高等数学强化2:一元函数微分学 中值定理 极值点 拐点_一元函数中值定理-CSDN博客 高等数学强化3:一元函数积分学 P积分-CSDN博客 高等数学强化3:定积分几何应用-CSDN博客...

Linux--自定义shell

shell shell就是操作系统提供给用户与操作系统进行交互的命令行界面。它可以理解为一个用户与操作系统之间的接口&#xff0c;用户可以通过输入命令来执行各种操作&#xff0c;如文件管理、进程控制、软件安装等。Shell还可以通过脚本编程实现自动化任务。 常见的Unix系统中使…...

AIGC 实战:Ollama 和 Hugging Face 是什么关系?

Ollama和 Hugging Face 之间存在着双重关系&#xff1a; 1. Ollama是 Hugging Face 开发并托管的工具&#xff1a; Ollama是一个由 Hugging Face 自行开发的开源项目。它主要用于在本地运行大型语言模型 (LLM)&#xff0c;特别是存储在 GPT 生成的统一格式 (GPT-Generated Un…...

Gitee教程2(完整流程)

1.配置git git config --global user.name "用户名" git config --global user.email "密码" 如何获取&#xff1f; gitee右上角加号点击新建仓库&#xff0c;仓库名随便起一个就行 找到这条命令&#xff0c;把这两句一个一个复制到vscode终端就行 2.创建g…...

Go 1.22 中的 for 循环新特性详解

目录 每次迭代都创建新变量 支持整数类型循环 小结 在 Go 语言中&#xff0c;for 循环是实现迭代的主要方式。Go 中的 for 循环非常灵活&#xff0c;有多种使用方式&#xff0c;包括传统的三部分 for 循环、类似于其他语言中的 while 循环以及迭代集合的 range 循环。 在 1…...

igolang学习2,golang开发配置国内镜像

go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.cn,direct...

R语言空间分析、模拟预测与可视化

随着地理信息系统&#xff08;GIS&#xff09;和大尺度研究的发展&#xff0c;空间数据的管理、统计与制图变得越来越重要。R语言在数据分析、挖掘和可视化中发挥着重要的作用&#xff0c;其中在空间分析方面扮演着重要角色&#xff0c;与空间相关的包的数量也达到130多个。在本…...

体育赛事直播系统软件开发

体育赛事直播系统的软件开发是一个复杂的项目&#xff0c;需要多个方面的准备和工作。以下是开发这样一个系统可能涉及的主要步骤和考虑因素&#xff1a; 需求分析和规划&#xff1a;首先需要明确系统的功能需求&#xff0c;包括直播视频的流媒体处理、用户管理、直播赛事安排…...

使用 kind 集群安装运行极狐GitLab Runner【上】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 关于 kind kind 是一个用来运行本地 Kubernetes 机群的工具&a…...

wine 源码 vk3d wine-gecko wine-mono 各版本 国内下载地址 中国科技技术大学源

下载地址 Index of /wine/...

【ArcGIS微课1000例】0104:二位面状数据转三维多面体(建筑物按高度拉伸)

文章目录 一、加载数据二、添加高度字段三、三维拉伸显示四、生成三维体数据五、注意事项一、加载数据 打开ArcScene,加载配套实验数据(0104.rar中的二维建筑物矢量数据,订阅专栏,获取专栏所有文章阅读权限及配套数据),如下图所示: 二、添加高度字段 本实验将二维数据…...

jquery简介与解析

jQuery是一款流行的JavaScript库&#xff0c;旨在简化客户端脚本编写。它针对DOM操作、事件处理、动画效果和AJAX交互提供了简洁高效的解决方案&#xff0c;使得开发者能够更加便捷地创建交互式网页。 // jQuery小插件&#xff1a;给带有highlight类的元素添加鼠标悬停效果 (fu…...

Apache Commons开源的工具库介绍

Apache Commons 是 Apache 软件基金会主持的一个项目&#xff0c;旨在提供一系列可重用的 Java 组件。这些组件覆盖了从数据封装、文本处理到网络通信等各个方面&#xff0c;是 Java 开发中常用的一系列工具库。Apache Commons 项目下的各个库通常以 "commons-" 开头…...

SQL语法法则

概念 SQL语法规则&#xff1a;SQL是一种结构化编程语言 基础SQL指令通常是以行为单位 SQL指令需要语句结束待&#xff0c;默认是英文分号:;、\g、\G SQL指令类似自然语言 编写的SQL中如果用到了关键字或者保留字&#xff0c;需要使用反引号、来包裹&#xff0c;让系统忽略 …...

Java命令模式:让请求成为对象

Java命令模式&#xff1a;让请求成为对象 在软件设计中&#xff0c;我们经常遇到需要将操作或请求封装成对象的情况。这样&#xff0c;我们可以将它们作为参数传递、排队、记录或撤销。命令模式正是为了满足这种需求而诞生的。在命令模式中&#xff0c;一个请求或操作被封装成…...

研究生摆烂摆烂的一个寒假

寒假&#xff1a;27-24&#xff0c;不到一个月 刚回家&#xff0c;不想学习&#xff0c;摆烂 想学了&#xff0c;又过年了&#xff0c;于是又开摆 又想学了&#xff0c;家里面有有点小事&#xff0c;于是又开摆 摆完&#xff0c;没想到就返校啦 期末作业没完成&#xff08…...

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存档编辑器完整使用教程

终极指南&#xff1a;10分钟掌握SPT-AKI存档编辑器完整使用教程 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: https://gitcode.com/gh_mirrors/sp/…...

FanControl终极指南:免费开源的风扇控制神器,轻松解决Windows散热与噪音问题

FanControl终极指南&#xff1a;免费开源的风扇控制神器&#xff0c;轻松解决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一致性互连架构解析在现代多核处理器设计中&#xff0c;一致性互连网络如同城市交通系统般重要。Arm Neoverse CMN-700作为第二代Coherent Mesh Network解决方案&#xff0c;其架构设计充分考虑了数据中心和边缘计算的严苛需求。与传统的总线或环形拓扑…...

生物信息学逆向解析mRNA疫苗序列:从公开数据组装BNT-162b2与mRNA-1273的基因蓝图

1. 项目概述与背景解析 最近在生物信息学和疫苗研究领域&#xff0c;一个名为“NAalytics/Assemblies-of-putative-SARS-CoV2-spike-encoding-mRNA-sequences-for-vaccines-BNT-162b2-and-mRNA-1273”的项目引起了我的注意。这个项目标题看起来很长&#xff0c;但核心非常明确&…...

如何选蜂蜜品牌?2026年5月推荐靠谱蜂蜜品牌避坑指南

一、引言买蜂蜜怕踩坑&#xff1f;市面上的蜂蜜产品琳琅满目&#xff0c;但勾兑蜜、浓缩蜜、添加糖浆的“科技蜜”层出不穷&#xff0c;消费者往往花了高价却买不到真正的纯正好蜜。对于注重健康饮食、追求天然原生态食品的消费者而言&#xff0c;如何从海量品牌中筛选出真正无…...

基于Go的轻量级自托管IM系统OpenWhisp部署与架构解析

1. 项目概述&#xff1a;一个开源的即时通讯解决方案最近在折腾一个内部协作工具&#xff0c;需要集成一个轻量级的即时通讯模块。市面上成熟的方案不少&#xff0c;但要么是SaaS服务&#xff0c;数据不在自己手里&#xff0c;心里不踏实&#xff1b;要么是像Rocket.Chat、Matt…...

3分钟快速上手:m4s-converter让B站缓存视频秒变MP4格式

3分钟快速上手&#xff1a;m4s-converter让B站缓存视频秒变MP4格式 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在当今数字内容时代&#xff…...

046、PCIE桥设备与交换:当拓扑开始复杂起来

046、PCIE桥设备与交换&#xff1a;当拓扑开始复杂起来 最近在调一块自定义的PCIE扩展板&#xff0c;系统里突然出现了几个“神秘”的端点设备。在lspci列表里&#xff0c;它们出现在一个我从未配置过的总线号上&#xff0c;而且设备ID全对不上。折腾了两天才发现&#xff0c;原…...

企业采购必读:ElevenLabs合同中6处关键条款陷阱(含地域限制、转授权失效、审计权模糊等),法务已验证

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;企业采购必读&#xff1a;ElevenLabs合同中6处关键条款陷阱&#xff08;含地域限制、转授权失效、审计权模糊等&#xff09;&#xff0c;法务已验证 地域限制条款的隐性封锁效应 ElevenLabs服务协议第…...

量子计算优化Benders分解:减少量子比特与提升收敛效率

1. 量子辅助Benders分解框架概述混合整数线性规划(MILP)在供应链管理、金融优化和资源调度等领域有着广泛应用。传统Benders分解算法通过将原问题拆分为处理整数变量的主问题(MP)和处理连续变量的子问题(SP)进行迭代求解。然而&#xff0c;随着问题规模扩大&#xff0c;主问题的…...