首页 > 编程语言 >C++ STL容器之vector、list

C++ STL容器之vector、list

时间:2023-07-13 13:33:22浏览次数:55  
标签:删除 STL list 插入 vector 内存 空间

(1) vector
连续存储的容器,动态数组,在堆上分配空间
底层实现:数组
扩容机制:
vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。
性能:
访问:O(1)
插入:
在最后插入,空间够,很快
在最后插入,空间不够,需要内存申请和释放,以及对之前数据进行拷贝。
在中间插入,空间够,内存拷贝
在中间插入,空间不够,需要内存申请和释放,以及对之前数据进行拷贝。
删除:
在最后删除,很快
在中间删除,内存拷贝
适用场景: 经常随机访问,且不经常对非尾节点进行插入删除。

(2) list
动态链表,在堆上分配空间,每插入一个元数都会分配空间,每删除一个元素都会释放空间。
底层:双向链表
性能:
访问:随机访问性能很差,只能快速访问头尾节点。
插入:很快,一般是常数开销
删除:很快,一般是常数开销
适用场景:经常插入删除大量数据

2、区别:
(1) vector底层实现是数组;list是双向链表。
(2) vector支持随机访问,list不支持。
(3) vector是顺序内存,list不是(list只能快速访问头尾节点)。
(4) vector在中间节点进行插入删除会导致内存拷贝,list不会。
(5) vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。
(6) vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。

3、应用
vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随机访问,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。

 

标签:删除,STL,list,插入,vector,内存,空间
From: https://www.cnblogs.com/lyfily-p-7439305/p/17550211.html

相关文章

  • DevExpress WinForms TreeList控件,让业务数据展示更清晰!(一)
    DevExpressWinForms的TreeList控件是一个功能齐全、数据感知的TreeView-ListView的混合体,它可以以树形、网格或两者结合的形式显示数据信息。无论是数据绑定模式还是非绑定模式,都具有完整的数据编辑支持。PS:DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有......
  • DataTable转为List集合
    publicclassTabletoList{publicstaticList<T>TableToListModel<T>(DataTabledt)whereT:new(){//定义集合List<T>ts=newList<T>();//获得此模型的类型Type......
  • 对目标元素进行监听 - addListener和IntersectionObserver
    在web的构建中,经常需要对元素进行监听,例如监听元素是否出现在可视范围内。我们可以通过addEventListener来监听滚动,计算元素距离顶部的位置对元素的变更来做出反应。但是长时间大量的触发事件反而对网页性能影响很大,使用节流的话其实也只是浅浅的优化一下性能。有没有其他思路可......
  • 字符串转list以及list调remove方法报错
    Stringstr=scanner.nextLine();String[]arr=str.split("");List<String>list=newArrayList<>(Arrays.asList(arr));注意:使用Array.aslList时转出来的list是没有add和remove方法的,所以我们调用就会报错,把它放到newArrayList里面就能解决这个......
  • golang的list数据结构demo
    packagemainimport"container/list"funcmain(){varmylistlist.List//放在尾部mylist.PushBack("go")mylist.PushBack("grpc")mylist.PushBack("mysql")//头部放数据mylist.PushFront("gi......
  • vector的相关操作
    插入元素:可以使用insert()函数在指定位置插入一个或多个元素。可以通过指定插入位置的迭代器和插入元素的值或范围来进行插入操作。例如:cppstd::vector<int>v={1,2,3,4,5};v.insert(v.begin()+2,10);//在第三个位置插入元素v.insert(v.begin()+3,3,7);......
  • windows下rclone挂在alist
    相比RaiDrive,rclone开源、免费、无广告、无弹窗。在使用上,rclone可能比RaiDrive卡顿。原因是rclone启动参数没设置好。把rclone的启动命令换成下面这个,将使rclone流畅度提升数倍。.\rclonemountalist:M:--network-mode--header"Referer:"--multi-thread-streams8--bu......
  • todoList
    <scriptsetup>import{ref}from"vue";consttodo=ref("");consttodoList=ref([]);constaddTodo=()=>{ todoList.value.push({todoName:todo.value,status:false}); todo.value="";}constdeleteTodo=()......
  • 动态数组和C++ std::vector详解
    目录1.std::vector2.vector的用法    2.1vector的定义和声明    2.2成员函数        2.2.1基本函数            operator=            assign            get_allocator        2.2.2元素访问   ......
  • CMakeLists编译静态库与动态库
    一、编写一个库编写一个计算整数和浮点数之和的库函数mymath,文件目录 mymath.h#ifndefMYMATH_H#defineMYMATH_H intadd(int,int);doubleadd(double,double); #endifmymath.cc#include"mymath.h" intadd(inta,intb){  returna+b;} doubleadd(doublea,d......