【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://xiahunao.cn/news/2806518.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

VMware虚拟机从一台电脑复制到另一台电脑

1 概述 在一台电脑上利用虚拟机安装了OS系统&#xff0c;特别是如果虚拟机中的系统进行了各种繁琐的配置&#xff0c;因为换电脑或者需要在其他电脑上配置&#xff0c;这个时候就可以将虚拟机中的系统复制拷贝一份到新电脑上&#xff0c;省时省力。 2 操作步骤 2.1 vmx文件 …

Python学习 --- 面向对象

1.什么是对象 1.Python中创建类的关键字是 class 2.类的成员方法 1.函数是写在类外面的,方法则是写在类里面的 1.上面这一段代码中就展示了如何在方法中访问类的成员变量: self.成员变量名 3.魔术方法 魔术方法其实就是python中的类中的内置方法,下面这几个只是我们比较常…

高级语言期末2011级B卷

1.编写函数&#xff0c;实现按照如下公式计算的功能。其中n为自然数。 #include <stdio.h>int fac(int n) {if(n0)return 1;elsereturn n*fac(n-1); }double func(int n) {if(n0)return 0;return 1.0*n/((n1)*fac(n2))func(n-1); } 2.编写函数&#xff0c;对给定的整数数…

Flutter Engine 编译

本地环境 Flutter 开发基本环境配置&#xff0c;SDK【】 MAC. M2芯片 git工具 python环境[MAC自带] xcode Chromium depot_tools depot_tools 是调试 Flutter 引擎的必备工具包&#xff0c;包含了 gclient、gn 和 ninja 等工具&#xff0c;这些在下面会用到&#xff01;…

线段树学习笔记 下

可持久化线段树 上面两篇是几年前写的&#xff0c;笔者今日才加以整理&#xff0c;如有错误请见谅。 线段树加上版本就是可持久化线段树。 Problem Intro 给定一个数组&#xff0c;只需要单点修改和单点查询&#xff0c;但要维护版本。 具体说&#xff0c;每一次操作可能从…

中兴助力低空经济发展,携山东移动完成5G-A通感一体商用验证

日前&#xff0c;中兴通讯在5G-A通感一体化技术研究和商用落地领域实现新突破。具体来说&#xff0c;中兴通讯联手山东移动&#xff0c;率先完成了5G-A&#xff08;5G-Advanced&#xff09;通感一体化技术试点&#xff0c;完成对低空无人机的通信感知融合测试。据悉&#xff0c…

Linux使用C语言获取进程信息

Linux使用C语言获取进程信息 Author: OnceDay Date: 2024年2月22日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档: Linux proc目录详解_/proc/mounts-CSDN博客Linux下/proc目录介绍 - 知乎 (zhihu.com)Linux内…

普中51单片机学习(AD转换)

AD转换 分辨率 ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。常用二进制的位数表示。例如12位ADC的分辨率就是12位&#xff0c;或者说分辨率为满刻度的1/(2^12)。 一个10V满刻度的12位ADC能分辨输入电压变化最小值是10V1/(2^12 )2.4mV。 量化误差 …

基于协同过滤算法的体育商品推荐系统

摘要 本文深入探讨了基于协同过滤算法的体育商品推荐系统的构建方法及其在电子商务中的重要性。首先&#xff0c;介绍了协同过滤算法的基本原理&#xff0c;包括用户-商品矩阵、相似度度量和推荐生成。其次&#xff0c;探讨了协同过滤算法在体育商品推荐中的两种主要应用方式&a…

Java知识点一

hello&#xff0c;大家好&#xff01;我们今天开启Java语言的学习之路&#xff0c;与C语言的学习内容有些许异同&#xff0c;今天我们来简单了解一下Java的基础知识。 一、数据类型 分两种&#xff1a;基本数据类型 引用数据类型 &#xff08;1&#xff09;整型 八种基本数…

Qt Android sdk配置报错解决

使用的jdk8总是失败&#xff0c;报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17&#xff0c;就配置生效了。Android sdk路径可以选用Android Studio自带的&#xff0c;但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

28-k8s集群中-StatefulSets控制器(进阶知识)

一、statefullsets控制器概述 1&#xff0c;举例 假如&#xff0c;我们有一个deployment资源&#xff0c;创建了3个nginx的副本&#xff0c;对于nginx来讲&#xff0c;它是不区分启动或者关闭的先后顺序的&#xff0c;也就是“没有特殊状态”的一个服务&#xff0c;也成“无状…

使用yolo-seg模型实现自定义自动动态抠图

yolov8导航 如果大家想要了解关于yolov8的其他任务和相关内容可以点击这个链接&#xff0c;我这边整理了许多其他任务的说明博文&#xff0c;后续也会持续更新&#xff0c;包括yolov8模型优化、sam等等的相关内容。 YOLOv8&#xff08;附带各种任务详细说明链接&#xff09; …

java——特殊文件日志技术

目录 特殊文件Properties文件XML文件XML文件有如下的特点XML的作用和应用场景解析XML文件 日志技术概述日志技术的体系结构Logback日志框架概述快速入门核心配置文件logback.xml日志级别项目中使用日志框架 特殊文件 Properties文件 后缀为.properties的文件&#xff0c;称之…

Qt MDI应用方法:QMdiArea和QMdiSubWindows类

重点&#xff1a; 1.使用MDI应用程序&#xff0c;需要在主窗口的工作区放置一个QMdiArea组件。 并将QMdiArea组件设置成中心窗口 2.MDI有两个显示模式&#xff1a;Tab多页显示模式和子窗口显示模式 子窗口显示模式有两种显示方法&#xff1a;窗口级联展开和平铺展开 窗口级联…

Vue+SpringBoot打造超市自助付款系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账单模块 三、界面展示3.1 登录注册模块3.2 超市商品类型模块3.3 超市商品模块3.4 商品购买模块3.5 超市账单模块 四、部分源码展示4.1 实体类定义4.2 控制器接口 五、配套文档展示六、…

(蓝桥杯软件赛Java研究生组/A组)第一章语言基础-第二节:Java基础

文章目录 一&#xff1a;标识符、修饰符和注释&#xff08;1&#xff09;标识符&#xff08;2&#xff09;修饰符&#xff08;3&#xff09;注释 二&#xff1a;数据类型&#xff08;1&#xff09;分类&#xff08;1&#xff09;基本数据类型&#xff08;2&#xff09;引用数据…

大数据之Flink优化

文章目录 导言&#xff1a;Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

在 where子句中使用子查询(一)

目录 子查询返回单行单列 查询公司工资最低的员工信息 查找公司雇佣最早的员工信息 子查询返回单行多列 查询与 ALLEN 工资相同&#xff0c;职位相同的所有员工信息 子查询返回多行单列 IN 操作 查询职位是“MANAGER”的所有员工的薪水 Oracle从入门到总裁:https://bl…

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…