vector 与 list 区别 + 使用场景

vector 与 list 区别 + 使用场景

一、底层结构

  • vector :动态数组,连续内存空间,基于数组扩容实现
  • list :双向循环链表,不连续内存,每个节点存数据+前后指针

二、核心区别

  1. 内存布局

    • vector:连续内存
    • list:碎片化非连续内存
  2. 随机访问

    • vector:支持 []、at(),O(1) 随机访问
    • list:不支持随机访问,只能遍历迭代,访问中间元素 O(n)
  3. 插入/删除

    • vector:中间插入删除O(n),需要搬移元素;尾部快
    • list:任意位置插入删除O(1),只改指针,不搬数据
  4. 扩容机制

    • vector:满了自动扩容、重新分配内存、拷贝元素、迭代器容易失效
    • list:无扩容概念,每次新增只分配单个节点,迭代器不易失效
  5. 空间占用

    • vector:内存紧凑,额外开销小
    • list:每个节点多两个指针,内存开销更大,缓存不友好
  6. 迭代器失效

    • vector:插入/删除、扩容极易失效
    • list:仅被删除节点的迭代器失效,其他不受影响

三、使用场景

用 vector 的场景

  1. 需要频繁随机访问、下标取值
  2. 大部分操作是尾部增删,中间很少插入删除
  3. 追求缓存命中率、内存紧凑
  4. 普通数组、存储数据列表、缓冲区、容器默认首选

用 list 的场景

  1. 任意位置频繁插入、删除
  2. 不需要随机访问,只顺序遍历
  3. 不希望迭代器轻易失效
  4. 任务队列、频繁增减节点、链表结构业务

随机访问、尾部操作用 vector;频繁中间插删、不随机访问用 list。

相关推荐
努力实干4 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
syagain_zsx7 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克6058 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
小小、码农9 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
库玛西10 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
General_G11 小时前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
syagain_zsx11 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
welfare96212 小时前
新号别搞:C++_list
开发语言·c++
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》云端 API 调用基础与 Apifox 调试实战
网络·c++·语言模型
坤坤子吖12 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习