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。

相关推荐
郝亚军2 分钟前
IEEE 754 单精度浮点的SEM表示
开发语言·c++·算法
Yyyyyy~2 小时前
【C++】数组篇
开发语言·c++
qq_333120972 小时前
C++高并发内存池的整体设计和实现思路_C 语言
java·c语言·c++
牛肉在哪里2 小时前
ros2 从零开始27 编写广播C++
开发语言·c++·机器人
Curvatureflight2 小时前
前端国际化 i18n 落地实践:语言包、动态文案和格式化问题怎么处理?
前端·c++·vue
黄小白的进阶之路2 小时前
C++提高编程---3.9 STL-常用容器-map/multimap 容器【P231~P235】
c++
WBluuue2 小时前
Codeforces 1096 Div3(ABCDEFGH)
c++·算法
誰能久伴不乏2 小时前
ibmodbus “Invalid argument“ 错误的排查与修复
c++·qt·modbus
basketball6162 小时前
Kadane算法 C++实现
java·c++·算法
handler012 小时前
【C++】二叉搜索树详解及其模拟实现(代码)
开发语言·c++·算法·c··二叉搜索树·搜索树