C++ STL基本容器比较

2023-11-16

 摘自: http://blog.chinaunix.net/u2/75321/showart_1144742.html
在STL中基本容器有: string、vector、list、deque、set、map

set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问

set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少
map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了

string、vector、list、deque、set 是有序容器
1.string

string 是basic_string<char> 的实现,在内存中是连续存放的.为了提高效率,都会有保留内存,如string s= "abcd",这时s使用的空间可能就是255, 当string再次往s里面添加内容时不会再次分配内存.直到内容>255时才会再次申请内存,因此提高了它的性能.
当内容>255时,string会先分配一个新内存,然后再把内容复制过去,再复制先前的内容.

对string的操作,如果是添加到最后时,一般不需要分配内存,所以性能最快;
如果是对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低.

如果删除元素,string一般不会释放它已经分配的内存,为了是下次使用时可以更高效.

由于string会有预保留内存,所以如果大量使用的话,会有内存浪费,这点需要考虑.还有就是删除元素时不释放过多的内存,这也要考虑.

string中内存是在堆中分配的,所以串的长度可以很大,而char[]是在栈中分配的,长度受到可使用的最大栈长度限制.

如果对知道要使用的字符串的最大长度,那么可以使用普通的char[],实现而不必使用string.
string用在串长度不可知的情况或是变化很大的情况.

如果string已经经历了多次添加删除,现在的尺寸比最大的尺寸要小很多,想减少string使用的大小,可以使用:
string s = "abcdefg";
string y(s); // 因为再次分配内存时,y只会分配与s中内容大一点的内存,所以浪费不会很大
s.swap(y); // 减少s使用的内存

如果内存够多的话就不用考虑这个了
capacity是查看现在使用内存的函数
大家可以试试看string分配一个一串后的capacity返回值,还有其它操作后的返回值

2.vector

vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放.如果新值>当前大小时才会再分配内存
对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高.
访问方面,对任何元素的访问都是O(1),也就是是常数的,所以vector常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作.

相比较可以看到vector的属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存.

总结
需要经常随机访问请用vector
3.list

list就是链表,元素也是在堆中存放,每个元素都是放在一块内存中
list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存,这与上面不同,可要看好了

list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机操作容器.
但是访问list里面的元素时就开始和最后访问最快
访问其它元素都是O(n) ,所以如果需要经常随机访问的话,还是使用其它的好

总结
如果你喜欢经常添加删除大对象的话,那么请使用list
要保存的对象不大,构造与析构操作不复杂,那么可以使用vector代替
list<指针>完全是性能最低的做法,这种情况下还是使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存
4.deque

双端队列,也是在堆中保存内容的.它的保存形式如下:

[堆1]
...
[堆2]
...
[堆3]

每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品,不过确实也是如此
deque可以让你在前面快速地添加删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度

vector是可以快速地在最后添加删除元素,并可以快速地访问任意元素
list是可以快速地在所有地方添加删除元素,但是只能快速地访问最开始与最后的元素
deque在开始和最后添加元素都一样快,并提供了随机访问方法,像vector一样使用[]访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转
deque也有保留空间.另外,由于deque不要求连续空间,所以可以保存的元素比vector更大,这点也要注意一下.还有就是在前面和后面添加元素时都不需要移动其它块的元素,所以性能也很高
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL基本容器比较 的相关文章

随机推荐

  • FLatten Transformer 简化版Transformer

    今天在找论文时 看到一篇比较新奇的论文 在这里跟大家分享一下 希望可以给一些人提供一些思路 虽然现在Transformer 比较火 在分割上面也应用的比较多 但是我一直不喜欢用 其中一个原因是结构太复杂了 平时我主要用一个sel atten
  • Java正则工具类:字母数字下划线、数据库url校验等

    文章目录 前言 一 正则基础语法 二 正则工具类 总结 前言 本文内容观摩的是其他作者的代码 在基础上增加修改了一些 参考原文地址 java用正则表达式 提示 以下是本篇文章正文内容 下面案例可供参考 一 正则基础语法 字符 描述 匹配输入
  • RabbitMQ --- 惰性队列、MQ集群

    一 惰性队列 1 1 消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度 就会导致队列中的消息堆积 直到队列存储消息达到上限 之后发送的消息就会成为死信 可能会被丢弃 这就是消息堆积问题 解决消息堆积有三种思路 增加更多消费者
  • Numpy中的转换成数组的array函数(更新中)

    今天给大家讲解一下图像处理和深度学习里面一个常用的函数array array的功能是接收一个多位置数 例如列表list 元 组tuple等 列表 list1 1 2 3 list2 1 2 3 list3 1 2 3 元组 tuple 1
  • 单片机串口时序与TTL电平

    串口是一个广义的概念 这是单讲单片机的串口UART 以及单片机的TTL电平 主要是记录一下自己忘了还能再看一下 1 TTL电平标准 输出 L lt 0 8V H gt 2 4V 输入 L lt 1 2V H gt 2 0V TTL器件输出低
  • VTK笔记-体绘制-vtkVolume

    体渲染 体渲染是一个用于描述3D数据渲染过程的术语 这里的3D数据是指其属性信息遍及3D空间 而不是一个在3D空间中的2D曲面 面渲染是对数据的表面或者一个抽取的轮廓进行渲染 是通过对面上的标量属性进行显示的 面渲染能显示其表面或者一个抽取
  • 常用数据结构与算法:二叉堆(binary heap)

    一 什么是二叉堆 二 二叉堆的实现 三 使用二叉堆的几个例子 一 什么是二叉堆 1 1 二叉堆简介 二叉堆故名思议是一种特殊的堆 二叉堆具有堆的性质 父节点的 键值 总是大于或等于 小于或等于 任何一个子节点的键值 二叉堆又具有二叉树的性质
  • vue 集成file-saver和xlsx 实现前端表格导出

    1 npm安装 npm install xlsx save npm install file saver save 2 创建export js import FileSaver from file saver import as XLSX
  • ntp时间同步软件_MES、SCADA项目中的时间同步—S7-1500和PC通过NTP进行时间同步

    写在面前 文中链接仅在微信公众号有效 大家好 我是小智 智能制造之家号主 前面我们在谈到MES SCADA项目的时候 更多的是从网络 从通讯协议 从数据采集方向去阐述 比如网络丢包 比如modbus TCP 比如S7 COMM 又比如网络冗
  • 踩坑之路(jpa的批量插入) Oracle

    今天做项目的一个需求 需要把其他地方的数据存储到本地数据里面 没想到一次踩了两个坑 因为需要保存的数据很大 而且每天都需要保存一次 第一次用的jpa的saveAll方法 测试了一遍 保存下来总共花了50分钟 老大看时间的太慢了 提醒了我一下
  • day10-Dom操作

    js Dom 概述 1 通过js获取页面上的元素 2 操作元素 2 1 操作元素的样式 2 2 操作元素的类名 2 3 操作元素属性 2 4 操作元素的内容 2 5 获取元素在dom中的一些信息 3 利用js来生成 添加 删除 修改 克隆元
  • 盘点一个Python自动化办公需求——获取文件夹下所以文件夹的名字,并存excel为一列

    01 前言 这个事情还得从前几天在Python最强王者群 东哥 问了一个Python自动化办公处理的问题 需求倒是不难 一起来看看吧 02 实现过程 这里 wangning 又给了一个答案 他自己之前整理的文章 不过需要自己稍微修改下才行
  • 几种硬盘IO性能测试工具

    dd工具 操作系统 ubuntu 12 04 测试工具 dd 版本 8 21 执行dd version来查看 工具说明 dd命令能粗略测试硬盘IO性能 不足 执行dd命令测试硬盘IO性能 对硬盘的损害很大 不建议多次或长时间尝试 测试命令
  • POSTMAN提取接口返回值

    记录一下 创建一个请求在Tests模块写入提取方法 如图 可点击右侧 Set a globals variable 直接生成写入全局变量语句 set token tk 中的 token为全局变量名称 切记后边的tk 变量名 不要加引号 写好
  • json按照key排序c语言实现,Json中的key类型

    JSON JavaScript Object Notation 是一种轻量级的数据交换格式 易于人阅读和编写 同时也易于机器解析和生成 它基于JavaScript Programming Language Standard ECMA 262
  • 一款集成ST-link下载及虚拟串口的STM32F103C8T6最小系统板设计

    前言 在以前的STM32单片机应用中 经常使用STM32F103C8T6最小系统板 小蓝板 作为主控 程序下载和串口交互都需要额外器件和接线 程序下载的话要用到ST link 串口交互用到USB TTL 常见的样子就下面这样吧 为了摆脱接线
  • java list 写入txt_java 如何用io流 读取list集合里我需要的内容,然后写入到.txt文件里?各位大侠请赐教...

    展开全部 import org junit Test import java io import java util ArrayList import java util List public class TestIo 路径 privat
  • 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布(3元获取腾讯云服务器带小程序支持系统)

    很多朋友都认为微信小程序申请 部署 发布很难 需要很长时间 实际上 微信和腾讯云同是腾讯产品 已经提供了10分钟 根据准备资源情况 已完成小程序申请认证 完成小程序开发 部署 发布的方式 当然 实现的是基础功能 但是 可以给学习者很便捷的体
  • ios接入GameCenter登录

    iOS接入GameCenter登录很简单 首先 在target gt Capabilities中打开GameCenter配置 这里的内购 In App Purchase 是因为我需要接内购的SDK 所以我把这个 In App Purchas
  • C++ STL基本容器比较

    摘自 http blog chinaunix net u2 75321 showart 1144742 html 在STL中基本容器有 string vector list deque set map set 和map都是无序的保存元素 只