STL常用容器对比

2023-05-16

    STL的常用容器大致有以下8个:

1.vector

    vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时。vector的另一个常见的问题就是clear操作。clear函数只是把vector的size清为零,但vector中的元素在内存中并没有消除,所以在使用vector的过程中会发现内存消耗会越来越多,导致内存泄露,现在经常用的方法是swap函数来进行解决:利用swap函数,和临时对象交换,交换以后,临时对象消失,释放内存。

    如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector。

2.list

    list是一个双向链表,因此它的内存空间是可以不连续的,通过指针来进行数据的访问,这使list的随机存储变得非常低效,因此list没有提供[]操作符的重载。但list可以很好地支持任意地方的插入和删除,只需移动相应的指针即可。

    如果你需要大量的插入和删除,而不关心随即存取,则应使用list。

3.deque

    deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的,可以认为deque是vector和list的折中。

    如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

4.map

    map是一种关联容器,该容器用唯一的关键字来映射相应的值,即具有key-value功能。map内部自建一棵红黑树(一种自平衡二叉树),这棵树具有数据自动排序的功能,所以在map内部所有的数据都是有序的,以二叉树的形式进行组织。map的插入和删除效率比其他序列的容器高,因为对关联容器来说,不需要做内存的拷贝和移动,只是指针的移动。由于map的每个数据对应红黑树上的一个节点,这个节点在不保存你的数据时,是占用16个字节的,一个父节点指针,左右孩子指针,还有一个枚举值(标示红黑色),所以map的其中的一个缺点就是比较占用内存空间。

    默认情况下内部数据进行升序排列。

    multimap是map的单key对多value的容器。

5.hash_map

    hash_map使用hash表来排列配对,hash表是使用关键字来计算表位置。当这个表的大小合适,并且计算算法合适的情况下,hash表的算法复杂度为O(1)的,但是这是理想的情况下的,如果hash表的关键字计算与表位置存在冲突,那么最坏的复杂度为O(n)。

    选用map还是hash_map,关键是看关键字查询操作次数,以及你所需要保证的是查询总体时间还是单个查询的时间。如果是要很多次操作,要求其整体效率,那么使用hash_map,平均处理时间短。如果是少数次的操作,使用 hash_map可能造成不确定的O(N),那么使用平均处理时间相对较慢、单次处理时间恒定的map,便更好些。

    默认情况下内部数据不排序。

6.set

    set也是一种关联性容器,它同map一样,底层使用红黑树实现,插入删除操作时仅仅移动指针即可,不涉及内存的移动和拷贝,所以效率比较高。set中的元素都是唯一的,而且默认情况下会对元素进行升序排列。所以在set中,不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,再插入新元素。不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取。

    multiset类似于数学里面的集合,集合中可以包含重复的元素。

7.queue

    queue是一个队列,实现先进先出功能,queue不是标准的STL容器,却以标准的STL容器为基础。queue是在deque的基础上封装的。之所以选择deque而不选择vector是因为deque在删除元素的时候释放空间,同时在重新申请空间的时候无需拷贝所有元素。

8.stack

    stack是实现先进后出的功能,和queue一样,也是内部封装了deque。自己不直接维护被控序列的模板类,而是它存储的容器对象来为它实现所有的功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL常用容器对比 的相关文章

  • C# 委托,泛型委托,匿名委托,lambda表达式

    一 泛型的定义及作用 泛型 generic 是C 2 0推出的新语法 xff0c 它是专门为处理多段代码在不同的数据类型上执行相同的指令的情况而设计的 比如说编程时 xff0c 碰到功能非常相似的模块 xff0c 只是它们所处理的数据类型不
  • C#连接sqlServer数据库详解

    C 是如何跟SQL Server进行连接的 xff1f 在C NET程序设计中 xff0c 离不开ADO NET ADO NET是 NET连接数据库的重要组件 使用其可以很方便地访问数据库 xff0c ADO NET还可以访问Oracle数
  • C++ 如何用创建txt文件,并且写入内容(汇总)

    void CreatTxt char pathName unsigned char rBuffer int length 创建txt文件 char path 61 34 C 1 txt 34 你要创建文件的路径 ofstream fout
  • 常用邮箱的 IMAP/POP3/SMTP 设置

    通过网上查找的资料和自己的总结完成了下面的文章 xff0c 看完之后相信大家对这三种协议会有更深入的理解 如有错误的地方望指正 POP3 POP3是Post Office Protocol 3的简称 xff0c 即邮局协议的第3个版本 它规
  • Critical error detected c0000374

    最近发现一个新奇的情况导致这个问题出现 版本不一致 简单来说 xff0c 就是有一个类A xff0c 调用类B xff1b 但是这个类B有两个版本B1 xff0c B2 大小不一致 xff1b 类B包含两个类C D 在调用类B时 xff0c
  • 串口通信协议

    概念 串口通信 xff08 Serial Communications xff09 的概念非常简单 xff0c 串口按位 xff08 bit xff09 发送和接收字节 尽管比按字节 xff08 byte xff09 的并行通信慢 xff0
  • [二] Nuttx移植-星瞳pyboard开发板

    目录 一 Nuttx配置文件二 构建自己的配置文件1 include board h文件构建2 kernel amp amp scripts 构建3 nsh defconfig 构建4 src 构建5 Kconfig 构建 三 修改 nut
  • Parrot Bebop2 与ROS

    第二章 无人机平台与开发环境搭建 本章主要介绍无人机平台及相关开发环境的搭建 包括介绍Parrot Bebop2的相关规格与使用说明 xff0c 以及ROS的操作系统的简介 发展历程 安装流程 xff0c 还有ROS的数据通信方式和ROS的
  • python2与python3解析数据

    蓝牙模块接收到监测设备传输来的数据 xff0c 封装格式为十六进制的数据帧 xff0c 蓝牙模块将数据通过串口发送给wrtnode 2p xff0c wrtnode通过ser2net服务将数据转为网络数据 xff0c 可以通过监听192 1
  • 上传本地项目到github远程仓库

    前提已经注册github账号并在本地电脑安装git客户端 1 为Github账户设置SSH key 进入git bash xff0c 通过如下命令生成 ssh keygen t rsa C 34 github所绑定的邮箱 34 一路回车 x
  • 卫星导航定位技术二:由星历参数求解卫星时空位置

    卫星星历是描述卫星运动轨道的信息 也可以说卫星星历就是一组对应某一时刻的轨道参数及其变率 有了卫星星历就可以计算出任意时刻的卫星位置及其速度 GPS卫星星历分为预报星历和后处理星历 预报星历又称广播星历 GPS广播星历参数共有16个 xff
  • 模式识别:最小错误率贝叶斯决策分类

    一 引言 1 用贝叶斯决策理论分类要事先知道两个条件及要求 xff1a 各类的先验概率 xff1a 及特征向量的条件概率密度 xff1a 或后验概率 xff1a 决策分类的类别一定 2 解决的问题 xff1a 已知一定数目的样本 xff0c
  • 模式识别:BP神经网络算法

    1 BP神经网络分类器 1 1 BP算法基本原理 神经网络结构大概如下图1 1 xff1a 图1 1 包括输入层 xff0c 隐层和输出层 包含一层隐层的神经网络称为浅层神经网络 xff0c 即SNN 包含多层隐层的神经网络称为深度神经网络
  • 模式识别:C-means(K-means)聚类算法与分级聚类(层次聚类)算法

    C均值聚类算法与分级聚类算法的聚类分析 一 实验目的 理解聚类的整体思想 xff0c 了解聚类的一般方法 xff1b 掌握 C means与分级聚类算法算法思想及原理 xff0c 并能够熟练运用这些算法进行聚类分析 xff1b 能够分析二者
  • ROS 配置多网口通讯

    列出当前所有的网络设备 ifconfig a 结果如下 xff1a enp1s0 Link encap Ethernet HWaddr 00 2f 5c 68 06 ad inet addr 192 168 1 101 Bcast 192
  • qt creator开启openMP加速方法

    环境 Qt creator4 11 for msvc2017 内置openmp库 启用方法 1 在pro文件加上QMAKE CXXFLAGS 43 61 openmp 2 添加头文件omp h
  • c++中::的用法

    是运算符中等级最高的 xff0c 它分为三种 1 global scope 全局作用域符 xff09 xff0c 用法 xff08 name 2 class scope 类作用域符 xff09 xff0c 用法 class name 3 n
  • 【ubuntu】——gflags&glog卸载与安装

    gflags glog 通过apt安装的glog xff0c gflags没有config cmake xff0c 所以在一些情况下需要手动编译 1 卸载gflags amp glog 只适用于通过apt安装的方式 span class t
  • 【算法】A* 寻路 可视化

    如下图 寻路图A 使用A 算法 xff0c 需要将地图抽象成一个个方块 xff0c 蓝色代表不可以动 墙 xff0c 黄色为起始点 xff0c 红色为目标点 其地图的二维坐标如图所示 xff0c 每一个单位为1米 A 的基本公式为 F n
  • 实验室新生成长指南[2.2.1] · 连接器

    欢迎进入 实验室新生成长指南 第二章 xff1a 硬件 本篇是 实验室新生成长指南 第二章第二节第一篇 xff1a 连接器 整个2 2节将帮助新手快速建立设计电路系统的一些基本知识储备 更多关于 实验室新生成长指南 的介绍 xff0c 请前

随机推荐

  • 走进音视频的世界——音视频的基本概念

    音视频通用的基本概念有码率 时长 xff0c 而不同音视频有不同的封装格式 编码协议 其中视频关键参数有分辨率 帧率 画质 旋转角度 像素格式 xff0c 而音频关键参数有采样率 声道数 声道布局 音质 采样数 采样位数 帧时长 接下来与大
  • 走进音视频的世界——新一代开源编解码器AV1

    AOMedia Video 1 xff08 AV1 xff09 是一种开源 免版税的编解码器 xff0c 最初设计用于Internet上的视频传输 它是由开放媒体联盟 xff08 AOMedia xff09 于VP9的继任者开发的 xff0
  • FFmpeg源码分析:avformat_find_stream_info分析码流信息

    FFmpeg在调用avformat open input 之后 xff0c 可能码流信息不够完整 xff0c 可以使用avformat find stream info 获取更多的码流信息 比如获取视频帧率 视频宽高 xff0c 重新计算最
  • Miracast投屏协议深入剖析

    Miracast由WiFi联盟制定 xff0c 以WiFi Direct IEEE802 11为无线传输标准 xff0c 允许手机向电视或其他接收设备进行无线投送视频 图片 和Miracast类似的投屏协议 xff0c 还有Airplay
  • c++:DFS与BFS详解

    DFS xff08 深度优先搜索 xff09 xff1a 从某个状态开始 xff0c 不断转移状态到无法转移为止 xff0c 然后退回到前一步 xff0c 继续转移到其他状态 xff0c 不断重复 xff0c 直至找到最终的解 总是从最开始
  • 一文掌握OpenGL的shader内置函数

    OpenGL ES有大量的GLSL内置函数 xff0c 包括 xff1a 三角函数 指数函数 通用函数 浮点函数 几何函数 矩阵函数 矢量关系函数 纹理函数 原子函数 图像函数 插值函数等 目录 一 三角函数 1 radians degre
  • 安全可靠的SRT实时传输协议

    Secure Reliable Transport SRT 是安全 可靠 低延时的多媒体实时传输协议 SRT协议使用AES进行数据加密 xff0c 运用FEC进行前向纠错 xff0c 并且有流量控制 拥塞控制 类似于QUIC协议 xff0c
  • android端使用openCV实现车牌检测

    现在 xff0c 汽车的踪影无处不在 xff0c 公路上疾驰 xff0c 大街边临停 xff0c 小区中停靠 xff0c 车库里停泊 管理监控如此庞大数量的汽车是个头疼的问题 精明的人们把目光放在车牌上 xff0c 因为车牌是汽车的 身份证
  • android端使用openCV与深度学习实现车牌识别

    车牌识别的应用场景随处可见 xff1a 高速公路上超速抓拍 小区门口关卡 车库入口关卡 xff0c 甚至出现在车载设备上 它的工作原理大致这样 xff1a 使用摄像头充当 眼睛 xff0c 使用openCV与深度学习充当 大脑 实时车牌识别
  • FFmpeg音频处理——音频混合、拼接、剪切、转码

    接触FFmpeg有一段时间了 xff0c 它是音视频开发的开源库 xff0c 几乎其他所有播放器 直播平台都基于FFmpeg进行二次开发 本篇文章来总结下采用FFmpeg进行音频处理 xff1a 音频混合 音频剪切 音频拼接与音频转码 采用
  • Android三种方式截取任意界面屏幕

    一 使用MediaProjectionManager Android5 0之后 xff0c 开放截取屏幕的API xff0c 也就是利用MediaProjectionManager创建VirtualDisplay xff0c 传入与Imag
  • ijkplayer基于rtsp直播延时的深度优化

    现在ijkPlayer是许多播放器 直播平台的首选 xff0c 相信很多开发者都接触过ijkPlayer xff0c 无论是Android工程师还是iOS工程师 我曾经在Github上的ijkPlayer开源项目上提问过 xff1a 视频流
  • C++ 程序编译过程

    前言 C语言的编译链接过程要把我们编写的一个c程序 xff08 源代码 xff09 转换成可以在硬件上运行的程序 xff08 可执行代码 xff09 xff0c 需要进行编译和链接 编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程
  • 自旋锁实现机理 spin_lock

    自旋锁的概念 自旋锁 xff08 spin lock xff09 是一种典型的对临界资源进行互斥访问的手段 xff0c 它是基于系统原子操作为基础 xff0c 自旋锁最多只能被一个可执行线程持有 xff0c 如果一个执行线程试图获得一个被已
  • 数据结构:图之DFS与BFS的复杂度分析

    BFS的复杂度分析 BFS是一种借用队列来存储的过程 xff0c 分层查找 xff0c 优先考虑距离出发点近的点 无论是在邻接表还是邻接矩阵中存储 xff0c 都需要借助一个辅助队列 xff0c v个顶点均需入队 xff0c 最坏的情况下
  • python中的os.path.dirname(__file__)的使用

    os path dirname file 返回脚本的路径 xff0c 但是需要注意一下几点 1 必须是实际存在的 py文件 xff0c 如果在命令行执行 xff0c 则会引发异常NameError name 39 file 39 is no
  • 北斗模块学习之初

    BD定义 xff1a 北斗卫星导航系统 xff08 BeiDou xff08 COMPASS xff09 NavigationSatellite System xff09 是中国正在实施的自主发展 独立运行的全球卫星导航系统 系统建设目标是
  • 关于Boost库和STL标准模板库

    一 关于STL 首先 xff0c 关于stl xff0c 最近也看了不少关于stl的博客 往大概的讲 xff0c stl即一种标准的模板库 xff0c 同时 xff0c 它也是静态库 xff0c 它存在的目的即是为了实现代码的服用性 xff
  • c语言char* 转char[]方法

    vector lt char gt splite by delim char host name char a 1000 strcpy a host name char p 61 strtok a split vector lt char
  • STL常用容器对比

    STL的常用容器大致有以下8个 xff1a 1 vector vector是一种动态数组 xff0c 在内存中具有连续的存储空间 xff0c 支持快速随机访问 由于具有连续的存储空间 xff0c 所以在插入和删除操作方面 xff0c 效率比