STL常用容器总结

1.Vector容器特性

vector 容器是一个长度动态改变的动态数组,既然也是数组,那么其内存是一段连续的内存,具有数组的随机存取的优点。

/+在这里插入图片描述

1.1.vector特性总结:

1.vector 是动态数组,连续内存空间,具有随机存取效率高的优点。
2.vector 是单口容器,在队尾插入和删除元素效率高,在指定位置插入会导致数据元素移动,效率低。

总结:

vector 是个动态数组,当空间不足的时候插入新元素,vector会重新申请一块更大的内存空间,将旧空间数据拷贝到新空间,然后释放旧空间。
vector是单口容器,所以在尾端插入和删除元素效率较高,在指定位置插入,势必会引起数据元素移动,效率较低。

2.Deque容器特性

deque和 vector 一样支持随机存取。 vector 是单向开口的连续性空间,而deque是一种双向开口的连续性空间,可以在头尾两端分别做元素的插入和删除操作。

2.1.deque和vector的最大差异?

一在于 deque 允许常数时间内对头端进行元素插入和删除操作。
二在于 deque没有容量的概念,因为它是动态的以分段的连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像 vector那样“因旧空间不足而重新分配一块更大的空间,然后再复制元素,释放空间”这样的操作不会发生在 deque 身上,也因此 deque没有必要提供所谓的空间保留功能。

在这里插入图片描述

deque操作示意图
而deque容器原理如下:

在这里插入图片描述

deque原理示意图

2.2.deque特性总结:

1).双端插入和删除元素效率较高.
2).指定位置插入也会导致数据元素移动,降低效率.
3).可随机存取,效率高.

2.3.经验之谈 :

1.deque 是分段连续的内存空间,通过中控器维持一种连续内存空间的状态,其实现复杂性要大于vector等容器。
2.其迭代器的实现也更加复杂,在需要对deque 容器元素进行排序的时候,建议先将 deque 容器中数据数据元素拷贝到 vector容器中,对 vector 进行排序,然后再将排序完成的数据拷贝回 deque 容器。

3.Stack容器特性

1.stack 是一种先进后出(first in last out,FILO)的数据结构,它只有一个出口,stack 只允许在栈顶新增元素,移除元素,获得顶端元素,
2.除了顶端之外,其他地方不允许存取元素,只有栈顶元素可以被外界使用,也就是说 stack不具有遍历行为,没有迭代器。

在这里插入图片描述

3.1.Stack特性总结:

1.stack 是一种先进后出(first in last out,FILO)的数据结构,栈不能遍历,不支持随机存取,只能通过 top 从栈顶获取和删除元素。

4.Queue容器

1.queue 是一种先进先出(first in first out,FIFO)的数据类型,他有两个口,数据元素只能从一个口进,从另一个口出。
2.队列只允许从队尾加入元素,队头删除元素,必须符合先进先出的原则,queue和 stack 一样不具有遍历行为。

在这里插入图片描述

4.1.queue特性总结:

必须从一个口数据元素入队,另一个口数据元素出队。能随机存取,不支持遍历

5.List容器

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
在这里插入图片描述

list示意图
而list原理示意图如下图:

在这里插入图片描述

list原理示意图

5.1.list特性总结

1.采用动态存储分配,不会造成内存浪费和溢出
2.链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
3.链表灵活,但是空间和时间额外耗费较大

5.2.链表和数组有什么区别?

1).数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
2).链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据元素。(数组中插入、删除数据项时,需要移动其它数据项)

6.set/multiset 容器

6.1 set/multiset特性

1.set/multiset 的特性是所有元素会根据元素的值自动进行排序。
2.set 是以RB-tree(红黑树,平衡二叉树的一种)为底层机制,其查找效率非常好。
3.set 容器中不允许重复元素,而multiset允许重复元素。

二叉树就是任何节点最多只允许有两个字节点。分别是左子结点和右子节点。
在这里插入图片描述

二叉树示意图

二叉搜索树,是指二叉树中的节点按照一定的规则进行排序,使得对二叉树中元素访问更加高效。
二叉搜索树的放置规则是:任何节点的元素值一定大于其左子树中的每一个节点的元素值,并且小于其右子树的值。
因此从根节点一直向左走,一直到无路可走,即得到最小值,一直向右走,直至无路可走,可得到最大值。
那么在二叉搜索树中找到最大元素和最小元素是非常简单的事情。
下图为二叉搜索树:
在这里插入图片描述
上面是二叉搜索树,那么当一个二叉搜索树的左子树和右子树不平衡的时候,那么搜索依据上图表示,搜索 9 所花费的时间要比搜索 17 所花费的时间要多,由于我们的输入或者经过我们插入或者删除操作,二叉树失去平衡,造成搜索效率降低。

7.map/multimap 容器

7.1map/multimap特性

map 具有键值和实值,所有元素根据键值自动排序。
pair 的第一元素被称为键值,第二元素被称为实值。
map也是以红黑树为底层实现机制。

map 和 multimap 区别在于,map 不允许相同 key 值存在,multimap 则允许相同 key 值存在。

8.STL容器共性机制

STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将原数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝

1.除了 queue 和 stack 之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
2.通常 STL 不会抛出异常,需要使用者传入正确参数。
3.每个容器都提供了一个默认的构造函数和默认的拷贝构造函数。
4.大小相关的构造方法: 1 size()返回容器中元素的个数 2 empty()判断容器是否为空。

9.STL容器使用时机

在这里插入图片描述

9.1 vector 的使用场景:

比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。

9.2.deque 的使用场景:

比如排队购票系统,对排队者的存储可以采用 deque,支持头端的快速移除,尾端的快速添加。
如果采用 vector,则头端移除时,会移动大量的数据,速度慢。

9.2.1 vector 与 deque 的比较:

一:vector.at()比 deque.at()效率高,比如 vector.at(0)是固定的,deque 的开始位置却是不固定的。
二:如果有大量释放操作的话,vector 花的时间更少,这跟二者的内部实现有关。
三:deque 支持头部的快速插入与快速移除,这是deque 的优点。

9.3.list 的使用场景:

比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入。

9.4.set 的使用场景:

比如对手机游戏的个人得分记录的存储,存储要求从高分到低分的顺序排列。

9.5.map 的使用场景:

比如按 ID 号存储十万个用户,想要快速要通过 ID 查找对应的用户。二叉树的查找效率,这时就体现出来了。
如果是 vector 容器,最坏的情况下可能要遍历完整个容器才能找到该用户。

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

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

相关文章

BBP飞控板中的坐标系变换

一般飞控板中至少存在以下坐标系: 陀螺Gyro坐标系加速度计Acc坐标系磁强计Mag坐标系飞控板坐标系 在BBP飞控板采用的IMU为同时包含了陀螺(Gyro)及加速度计(Acc)的6轴传感器,故Gyro及Acc为同一坐标系。同时…

【OAuth2系列】如何使用OAuth 2.0实现安全授权?详解四种授权方式

作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 【OAuth2系列】集成微…

鸿蒙MPChart图表自定义(六)在图表中绘制游标

在鸿蒙开发中,MPChart 是一个非常强大的图表库,它可以帮助我们创建各种精美的图表。今天,我们将继续探索鸿蒙MPChart的自定义功能,重点介绍如何在图表中绘制游标。 OpenHarmony三方库中心仓 一、效果演示 以下是效果演示图&…

《新概念模拟电路》-电流源电路

电流源电路 本系列文章主要学习《新概念模拟电路》中的知识点。在工作过程中,碰到一些问题,于是又翻阅了模电这本书。我翻阅的是ADI出版的,西安交通大学电工中心杨建国老师编写的模电书。 本文主要是基于前文《新概念模拟电路》-三极管的基础…

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

C 实现植物大战僵尸(四)

C 实现植物大战僵尸(四) 音频稍卡顿问题,用了 SFML 三方库已优化解决 安装 SFML 资源下载 https://www.sfml-dev.org/download/sfml/2.6.2/ C 实现植物大战僵尸,完结撒花(还有个音频稍卡顿的性能问题,待…

回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiLSTM-Attention多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、方法概述 CNN-BiLSTM-Attention多输入单输出回归预测方法旨在通过融合CNN的局…

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源,执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

让css设置的更具有合理性

目录 一、合理性设置宽高 二、避免重叠情况,不要只设置最大宽 三、优先使用弹性布局特性 四、单词、数字换行处理 五、其他编码建议 平常写css时,除了遵循一些 顺序、简化、命名上的规范,让css具有合理性也是重要的一环。 最近的需求场…

【微服务】1、引入;注册中心;OpenFeign

微服务技术学习引入 - 微服务自2016年起搜索指数持续增长,已成为企业开发大型项目的必备技术,中高级java工程师招聘多要求熟悉微服务相关技术。微服务架构介绍 概念:微服务是一种软件架构风格,以专注于单一职责的多个响应项目为基…

设计模式 结构型 组合模式(Composite Pattern)与 常见技术框架应用 解析

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。通过这种模式,客户端可以一致地处理单个对象和对象组合。 在软件开发中,我们经常会遇到处理对象的层…

抢先体验:人大金仓数据库管理系统KingbaseES V9 最新版本 CentOS 7.9 部署体验

一、简介 KingbaseES 是中国人大金仓信息技术股份有限公司自主研发的一款通用关系型数据库管理系统(RDBMS)。 作为国产数据库的杰出代表,它专为中国市场设计,广泛应用于政府、金融、能源、电信等关键行业,以高安全性…

Linux驱动开发(17):输入子系统–电阻触摸驱动实验

有关电阻触摸的基础知识内容可以参考野火STM32相关教程,这里只介绍电阻触摸驱动的相关内容。与一般的微处理器 不同,本节使用的imx6ull内自带触摸屏控制器,只需要把电阻触摸屏的信号线接到对应的IO即可,通过配置imx6ull 触摸屏控制…

8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)

RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator(生成器)3.3 检索器(Retriever)3.4训练(Training)3.5**解码方法**(求近似 )3.6微调的参数 …

简易CPU设计入门:通用寄存器的读写

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后,我…

【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型的部署

STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 【动手学电机驱动】STM32-MBD(3)Simulink 状态机模型部署…

Linux运维相关基础知识(二)

系列文章目录 Linux常用命令 linux 账号管理与权限设定 Linux运维相关基础知识 文章目录 系列文章目录前言1. 自动任务执行at 与 atdcrontab 与 crond 2. SELinuxtty多任务管理与进程管理相关的命令/proc/* 文件的意义SELinux 3. 守护进程早期SystemV的init管理行为中daemon…

K8s集群平滑升级(Smooth Upgrade of K8S Cluster)

简介: Kubernetes ‌ (简称K8s)是一个开源的容器编排和管理平台,由Google开发并维护。它最初是为了解决谷歌内部大规模容器管理的问题而设计的,后来在2014年开源,成为云原生技术的核心组成部分。‌‌1 K8…

党员学习交流平台

本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…

uniapp--HBuilder开发

提示:本文为学习内容,若有错误,请联系作者,谦虚受教。 文章目录 前言一、下载HBuilder二、添加modbus相关库1.下载nodejs2.下载modbus库3.项目添加modbus库 三、HBuilder相关功能语句1.文件夹说明2.消息信息框3.开关按钮4.选中按钮…