【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>

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于MATLAB优化的多焦点相位

1、概要 目前智能手机的显示屏得益于机械或化学性能的稳定&#xff0c;让这些手机非常耐用&#xff0c;显示屏具有足够硬度使其可以承受住很大的压力&#xff0c;甚至多年使用下来都没有磨损迹象。 但是另一方面&#xff0c;材料的硬度通常伴随着脆性&#xff0c;手机的屏幕玻…

无公网IP情况下如何远程查看本地群晖NAS存储的文件资源

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

4.寻找两个正序数组的中位数

题目&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解题思路&#xff1a;用二分法查找。使用归并的方式&#xff0c;合并两个有序数组&#xff0c;得到一个大的有序数组。大的…

LeetCode 热题 100 | 二叉树(一)

目录 1 基础知识 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 2 94. 二叉树的中序遍历 3 104. 二叉树的最大深度 4 226. 翻转二叉树 5 101. 对称二叉树 菜鸟做题&#xff0c;语言是 C 1 基础知识 二叉树常见的遍历方式有&#xff1a; 先序遍历中序遍历后序遍历…

C#,动态规划(DP)模拟退火(Simulated Annealing)算法与源代码

1 模拟退火 *问题:**给定一个成本函数f:r^n–>r*&#xff0c;找到一个 n 元组&#xff0c;该元组最小化 f 的值。请注意&#xff0c;最小化函数值在算法上等同于最大化(因为我们可以将成本函数重新定义为 1-f)。 很多有微积分/分析背景的人可能都熟悉单变量函数的简单优化。…

Python读取.nc数据并提取指定时间、经纬度维度对应的变量数值

本文介绍基于Python语言的netCDF4库&#xff0c;读取.nc格式的数据文件&#xff0c;并提取指定维&#xff08;时间、经度与纬度&#xff09;下的变量数据的方法。 我们之前介绍过.nc格式的数据&#xff0c;其是NetCDF&#xff08;Network Common Data Form&#xff09;文件的扩…

vue 中实现音视频播放进度条(满足常见开发需求)

由于开发需要&#xff0c;作者封装了一个音视频播放进度条的插件&#xff0c;支持 vue2 及 vue3 &#xff0c;有需要的朋友可联系作者&#xff0c;下面是对该款插件的介绍。 插件默认样式&#x1f447;&#xff08;插件提供了多个配置选项&#xff0c;可根据自身需求进行个性化…

临时内核映射

临时内核映射与永久内核映射的区别是&#xff0c;临时内核映射可以在中断处理程序和可延迟函数内部使用&#xff0c;它不堵塞当前进程。 一 原理介绍 临时内核映射的线性地址在永久内核映射的后面&#xff0c;范围是[FIXADDR_START, FIXADDR_TOP)&#xff0c;其基本逻辑是获取…

Zookeeper分布式一致性协议ZAB源码剖析

Zookeeper分布式一致性协议ZAB源码剖析 ZAB协议 ZK的强一致性 ZK严格来讲并不是实时强一致性&#xff0c;而是写时强一致性&#xff0c;读时顺序一致性 ZAB协议(原子广播协议)&#xff0c;Paxos算法的一种简化实现&#xff0c;包括两种基本模式 消息广播 消息广播过程中使用类…

“IT行业职业发展的黄金之路:哪些证书能为你增光添彩?“

文章目录 每日一句正能量前言1、浙大计算机程序设计能力考试证书&#xff08;PAT&#xff09;2、全国计算机等级考试证书(NCRE)3、计算机技术与软件专业资格考试证书&#xff08;软考&#xff09;4、通信专业技术人员职业水平证书5、全国计算机应用水平考试证书&#xff08;NIT…

优秀实践| 运营商核心系统国产数据库迁移实践

作者介绍 陕西移动信息技术部 张云川 陕西移动信息技术部 王永强 新炬网络中北三部 张建 随着国家对自主可控战略的深入推进&#xff0c;笔者所在省份聚焦数据库国产化替换&#xff0c;全面加速数据库国产化替换进程。以核心系统带动周边系统&#xff0c;成功在能力运营中…

详解 CSS 的背景属性

详解 CSS 的背景属性 背景颜色 语法&#xff1a; background-color: [指定颜色]; 注&#xff1a;默认是 transparent (透明) 的&#xff0c;可以通过设置颜色的方式修改 示例代码: 运行效果: 背景图片 语法&#xff1a;background-image: url(...); url 可以是绝对路径 也可…

【Java程序设计】【C00284】基于Springboot的校园疫情防控管理系统(有论文)

基于Springboot的校园疫情防控管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园疫情防控系统 本系统分为系统功能模块、管理员功能模块以及学生功能模块。 系统功能模块&#xff1a;在系统首页可以查…

后端经典面试题合集

目录 1. Java基础1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f;1-2. 什么是字节码&#xff1f;采用字节码的最大好处是什么&#xff1f; 1. Java基础 1-1. JDK 和 JRE 和 JVM 分别是什么&#xff0c;有什么区别&#xff1f; JDK 是Java开发工具包&am…

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

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 上一篇内容中&#xff0c;我们已经利用 kind 创建好了一个本地…

瑞_23种设计模式_装饰者模式

文章目录 1 装饰者模式&#xff08;Decorator Pattern&#xff09;1.1 介绍1.2 概述1.3 装饰者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析5 总结5.1 装饰者模式的优缺点5.2 装饰者模式的使用场景5.3 装饰者模式 VS 代理模式 &#x…

Java日志技术

概况 把程序运行的信息&#xff0c;记录到文件中&#xff0c;方便程序员定位bug&#xff0c;并了解程序的执行情况等 什么是日志 好比生活中的日记&#xff0c;可以记录你生活中的点点滴滴程序中的日志&#xff0c;通常就是一个文件&#xff0c;里面记录的是程序运行过程中的…

第四十回 宋江智取无为军 张顺活捉黄文炳-使用python集合计算人员变动

白龙庙聚会&#xff0c;梁上好汉人多势众&#xff0c;听说江州城里军队追赶过来了&#xff0c;大家一起出去迎敌。李逵一马当先杀入人群&#xff0c;花荣一箭射倒领头的马军&#xff0c;其它马军掉头就走&#xff0c;把自己的步兵冲倒了一半。大家一直杀到江州城边&#xff0c;…

Android | ArcGIS入门

一、概述 ArcGIS是由Esri开发的地理信息系统&#xff08;GIS&#xff09;软件。它用于制图、空间分析和数据可视化。ArcGIS允许用户以各种格式创建、管理、分析和共享地理信息。它通常用于城市规划、环境管理和应急响应等领域。该软件包括一系列工具&#xff0c;用于创建地图、…

KTV点歌系统vue+springboot音乐歌曲播放器系统

目前现有的KTV点歌系统对于用户而言其在线点歌流程仍然过于繁琐&#xff0c;对于歌曲而言其系统安全性并不能保障。同时整套系统所使用的技术相对较为落后&#xff0c;界面不能动态化展示。相比较于其它同类型网站而言不能体现技术先进性。 1.2 项目目标 KTV点歌系统的后台开发…
最新文章