STL几种常见类型的比较

2023-11-04

这里主要是想要比较几种容器的性能,至于他们的接口不在考虑范围

Vector

相当于一个数组。在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
优点:
1. 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()insert()erase()
2. 随机访问方便,即支持[ ]操作符和vector.at()
缺点
1. 在内部进行插入删除操作效率低。
2. 在vector的最后进行push和pop的效率高于 在vector的头进行push和pop。
3. 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放

list

相当于双向链表
每一个结点都包括一个信息快Info、一个前驱指针Pre、一个后驱指针Post。可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。
优点:
1. 不使用连续内存完成动态操作
2. 在内部方便的进行插入和删除操作
缺点:
1. 不能进行内部的随机访问,即不支持[ ]操作符
2. 相对于verctor占用内存多

deque

优点:
1. 随机访问方便,即支持[ ]操作符和vector.at()
2. 在内部方便的进行插入和删除操作
缺点:
1. 占用内存多

Map,Set

属于标准关联容器,使用了非常高效的平衡检索二叉树:红黑树,他的插入删除效率比其他序列容器高是因为不需要做内存拷贝和内存移动,而直接替换指向节点的指针即可。
Set和Vector的区别在于Set不包含重复的数据,当然有multiset,可以包含不同的元素。
Map和Hash_Map的区别是Hash_Map使用了Hash算法来加快查找过程,但是需要更多的内存来存放这些Hash桶元素,因此可以算得上是采用空间来换取时间策略。

其实对于STL中很多的底层实现都没能了然于心,之后有时间研究研究STL源码,学习学习

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

STL几种常见类型的比较 的相关文章

  • 在Python中将整数附加到列表的开头[重复]

    这个问题在这里已经有答案了 如何在列表的开头添加一个整数 1 2 3 42 1 2 3 gt gt gt x 42 gt gt gt xs 1 2 3 gt gt gt xs insert 0 x gt gt gt xs 42 1 2 3
  • Java:如何实现3和?

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 通过 id 从通用列表中删除对象

    我有一个像这样的域类 public class DomainClass public virtual string name get set public virtual IList
  • Python选择列表中最长字符串的最有效方法?

    我有一个可变长度的列表 并且正在尝试找到一种方法来测试当前正在评估的列表项是否是列表中包含的最长字符串 我正在使用Python 2 6 1 例如 mylist abc abcdef abcd for each in mylist if co
  • 省略号列表[...]并将列表连接到自身[重复]

    这个问题在这里已经有答案了 EDIT 我在最初的例子中很粗心 当我添加列表时不会发生该行为A本身 而是当我添加一个列表时含有 list A to A本身 请参阅下面更正的示例 我试图理解省略号如何列出 那些显示为 当你有一个列表引用本身时发
  • 如何将 BOOST_FOREACH 与两个 std::map 一起使用?

    我的代码基本上如下所示 std map
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • 根据 Mathematica 中的另一个列表值拆分列表

    在 Mathematica 中我有一个点坐标列表 size 50 points Table RandomInteger 0 size RandomInteger 0 size i 1 n 以及这些点所属的聚类索引列表 clusterIndi
  • Laravel:运行队列:在 Windows Azure Web App 上连续监听

    我觉得问这个问题有点傻 但我似乎无法在互联网上找到这个问题的答案 经过几个小时的搜索后 我发现在 Linux 服务器上 您使用 Supervisor 在您的网站上连续运行 php artisanqueue listen 无论有或没有守护进程
  • 双端队列与队列速度

    我正在研究 LeetCode 上的一个问题 Here https leetcode com problems moving average from data stream 当我完成这个问题后 我想出了 class MovingAverag
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • Python:两个列表之间的成对比较:列表 a >= 列表 b?

    如果我想检查列表中的所有元素 a 1 2 3 6 大于或等于另一个列表中对应的元素 b 0 2 3 5 如果 a i gt b i 对于所有i的 则返回 true 否则返回 false 这有逻辑功能吗 比如a gt b 谢谢 你可以这样做
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • Python range() 和 zip() 对象类型

    我了解功能如何range and zip 可以在 for 循环中使用 然而我期望range 输出一个列表 很像seq在 Unix shell 中 如果我运行以下代码 a range 10 print a 输出是range 10 表明它不是一
  • C++类名冲突

    我现在正在做一个项目 需要整合两个子项目 项目A是用C 编写的 项目B是用C编写的 一个问题是 在项目B中 有一个名为vector它是由其作者创建的 在项目 A 中 std vector in STL用来 因为项目B以后可能会更新 所以我不
  • 如果我不定义向量大小,程序会崩溃

    最近在学习C 偶然发现这个问题 std vector
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 如何推回向量的向量?

    我正在输入 20 行 我想用空格分隔每一行的内容并将其放入向量的向量中 如何制作向量的向量 我很难把它推回来 我的输入文件 Mary had a little lamb lalala up the hill the sun is up 该向
  • 从向量中删除元素在 R 中出现的时间量

    我想从一个向量中删除元素在另一个向量中出现的时间 就像我要减去它们一样 鉴于我想要删除的元素向量中的每个元素也存在于我想要从中删除的主向量中 a lt c A B B C C C b lt c A B C C a a in b return

随机推荐

  • Spring cloud项目扩展(二)项目集成redis和辅助工具hutool

    最近看到了一个很好用的集成开发工具 里面有很多工具类 可以提高开发效率 官方文档请看 https hutool cn docs 下面主要介绍一下在我们项目中加入工具并且通过这个工具使用redis 话不多说 直接开始 1 在我们原有的项目的项
  • 2021-05-05

    实训3 信息加密与哈希函数 实验目的 理解加密系统的概念 掌握经典加密的主要方法 理解混淆与扩散的概念 掌握DES加密的主要方法 了解非对称加密的重要意义 掌握RSA加密算法的主要思想与使用方法 理解数字签名的作用及生成方法 实验准备及注意
  • java声明方法抛出的异常

    java声明方法抛出的异常 TestExceptions java import java io 异常 public class TestExceptions public static void main String args void
  • 贵阳人文科技学院新颖的计算机毕业设计题目大全50例

    最近要准备毕业设计了 不会选题 希望可以帮忙给一些毕业设计题目 我整整花了一周把之前做的答辩通过的毕业设计成品进行整理如下列表 计算机科学技术毕业设计题目推荐1 10题 1 Springboot美食网站92nn7 2 Springboot基
  • Adb connection Error:远程主机强迫关闭了一个现有的连接

    小编遇到这个烦人的问题 总是一直报错 浏览了许多网页 总结了以下几种解决方法 这些都是转载加上自己的见解 这里本人是用最后一种搞定的 不过有时候需要进入paltform tools目录下 因为没有PATH路径 注意这种方法需要启动虚拟记得就
  • Stable Diffusion公司重磅开源大语言模型StableLM,又爆火了!

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉 微信技术交流群 金磊 发自 凹非寺转载自 量子位 QbitAI 万万没想到 以文生图著名的Stable Diffusion 也入局了大语言模
  • Java String 字符串 截取保留小数点后两位

    截取保留小数点后两位 public static String dealRateStr String rateStr int i rateStr indexOf 如果没有小数点不 if i 1 return rateStr 00 获取小数点
  • Java设计模式:23种设计模式全面解析,墙都不扶就服你

    命令模式 将命令请求封装为一个对象 使得可以用不同的请求来进行参数化 迭代器模式 一种遍历访问聚合对象中各个元素的方法 不暴露该对象的内部结构 观察者模式 对象间的一对多的依赖关系 仲裁者模式 用一个中介对象来封装一系列的对象交互 备忘录模
  • 关于定时任务简单小脚本

    1 每4小时备份一次 etc 目录至 backup目录中 保存的文件名称格式为 etc yyyy mm dd HH tar xz crontab e 进入编辑模式 tar JcPf创建文档并保存为 xz格式 0 4 tar JcPf bac
  • 深入理解数据结构——图

    include
  • SAC(Soft Actor Critic)学习记录

    SAC Soft Actor Critic 学习记录 基本介绍 SAC Soft Actor Critic 算法在近年来受到了许多的关注 得到了不少深度强化学习研究者的好评 这篇文章主要包含的内容有SAC算法的理论分析和核心代码实现 与许多
  • ProGan,关键创新在于渐进式训练

    2018年 NVIDIA首次用ProGAN解决了这一挑战 研究人员一直无法生成高质量的大图像 例如1024 1024 ProGAN的关键创新在于渐进式训练 它首先用极低分辨率的图像 如4 4 训练生成器和鉴别器 然后每次增加一个更高分辨率的
  • Float比较大小

    目录 起因 结论 科学计数法 十进制转二进制 整数 基本 二进制科学计数法 总结 小数 基本 二进制科学计数法 总结 IEEE754标准存储 基本 起因 在阅读 阿里巴巴开发手册 时发现了一句话 强制 浮点数之间的等值判断 基本数据类型不能
  • Linux(查看服务cpu核数和内存)

    linux服务器中最重要的两个配置是CPU和内存 那么怎么开始查看CPU核数和内存 以及使用情况 是日常运维中使用最多的操作 查看linux服务器cpu最简单的命令是 cat proc cpuinfo 查看linux服务器cpu最简单的命令
  • TCP常见面试题

    1 画出TCP的报头 2 说一下TCP的三次握手过程 3 为什么TCP握手需要三次 TCP是可靠的传输控制协议 三次握手能保证数据可靠传输又能提高传输效率 如果TCP的握手是两次 lt 1 gt 如果client发给server的SYN报文
  • Spring 事务事件控制 解决业务异步操作解耦 TransactionSynchronizationManager Transaction

    场景 在业务中 经常需要在执行数据库操作后 事务提交完成 发送消息或事件来异步调用其他组件执行相应的业务操作 比如 用户注册成功后 发送激活码或激活邮件 如果用户保存后就执行异步操作发送激活码或激活邮件 但是前面用户保存后发生异常 数据库进
  • kmeans聚类簇个数选择

    借助sklearn库实现kmeans聚类和轮廓系数计算 from sklearn cluster import KMeans from sklearn metrics import silhouette score K range 2 20
  • 使用Python与Stm32进行通信

    方法 利用python的serial函数库与STM32进行通信 将Stm32用USB连接到电脑 打开设备管理器查看端口 端口为COM3 写下Python程序 import serial 连接串口 serial serial Serial C
  • python Typing模块-类型注解

    写在篇前 typing 是python3 5中开始新增的专用于类型注解 type hints 的模块 为python程序提供静态类型检查 如下面的greeting函数规定了参数name的类型是str 返回值的类型也是str def gree
  • STL几种常见类型的比较

    这里主要是想要比较几种容器的性能 至于他们的接口不在考虑范围 Vector 相当于一个数组 在内存中分配一块连续的内存空间进行存储 支持不指定vector大小的存储 STL内部实现时 首先分配一个非常大的内存空间预备进行存储 即capaci