【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…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...