当前位置: 首页 > article >正文

vector扩容 list和vector的比较

1、vector 加入元素时空间不足如何扩容

vector 是一个动态数组,它会根据元素的个数,适当的去申请内存。可以简单的把 vector 理解为,其内部有一个 void* 指针,用于指向在堆上申请的空间。void* 指向的空间用于存放 vector 元素。vector 一直维护着 void* 空间的大小,当 void* 指向的堆区空间没有空间存放新插入的元素时,他都会去系统申请之前空间大小的两倍空间,并把之前的元素全部拷贝到新的空间,释放掉原空间,在新空间中插入新的元素。

当我们创建一个 vector 的时候,会首先分配给他一片连续的内存空间,如 std::vector<int>vec,当通过 push_back 向其中添加元素时,如果初始分配空间已满,就会引起 vector 扩容,其扩容规则在 gcc 下以两倍方式完成:

首先重新申请一个2倍大的内存空间;

然后将原空间的内容拷贝过来;

最后将原空间内容进行释放,将内存交还给操作系统;

vec.capacity():返回容器能存储的数据个数

vec.size():返回容器中存储的数据个数

在插入位置和删除位置之后的所有迭代器和指针引用都会失效,同理,扩容之后的所有迭代器指针和引用也都会失效。

2、list和vector的比较

list:地址不连续

1) 底层结构是带头节点的双向循环链表

2)在任意位置插入和删除的效率高,时间复杂度为O(1)

3)不支持随机访问

4)迭代器失效:插入元素不会导致迭代器失效,删除时只会导致当前迭代器失效,其他迭代器不受影响,重新赋值当前迭代器即可

vector:地址连续

1)底层结构是动态顺序表

2)在任意位置插入和删除效率低,插入有可能会增容,会导致开辟新空间,拷贝元素释放旧空间使效率更低

3)支持随机访问

4)迭代器失效:在插入元素可能会扩容导致所有迭代器失效,所有迭代器需要重新赋值,删除时当前迭代器会失效需要重新赋值

使用场景:

有大量插入和删除操作,不关心随机访问使用list

需要高效存储,支持随机访问,不关心插入删除效率时使用 vector


http://www.kler.cn/a/511799.html

相关文章:

  • 哈希(hashing)、哈希函数(Hash Function)、哈希表(Hash Table)、哈希冲突(Hash Collision)
  • 使用Torchvision框架实现对象检测:从Faster-RCNN模型到自定义数据集,训练模型,完成目标检测任务。
  • 【k8s面试题2025】1、练气期
  • C链表的一些基础知识
  • OpenHarmony-7.IDL工具
  • 自定义BeanPostProcessor实现自动注入标注了特定注解的Bean
  • Kotlin 2.1.0 入门教程(六)
  • Windows上同时配置GitHub和Gitee服务
  • MySQL left join联合查询(on)
  • 用公网服务器实现内网穿透
  • WPF 实现可视化操作数据库的程序全解析
  • 【MySQL篇】使用mysqldump导入报错Unknown collation: ‘utf8mb4_0900_ai_ci‘的问题解决
  • excel实用工具
  • 易答题PHP通用工资条成绩单自动排版打印工具V1.0
  • 大模型GUI系列论文阅读 DAY2:《ScreenAgent:一种基于视觉语言模型的计算机控制代理》
  • CycleGAN - CycleGAN网络:无监督图像到图像转换的生成对抗网络
  • C# ComboBox 控件属性
  • 接口自动化测试
  • YUM部署MySQL数据库
  • 抽象设计如何提升用户体验?
  • MySQL 默认最大连接数是多少?
  • k8s pod 中通过service account 访问API Server
  • Android 13/14 关键宏导致系统无声
  • Spring Boot 启动流程解析及重点源码
  • AI监管新思路:从规模导向迈向全面框架
  • 第7章:Python TDD测试Franc对象乘法功能