C++之vector/list/map完整对比与解读

 更新时间:2026年07月01日 11:14:37   作者:C++程序员kingfriend  
这段文章详细介绍了C++中三种常用容器vector、list和map的底层实现、核心性能对比及适用场景,通过对比它们在随机访问、插入删除、内存开销等方面的差异,帮助开发者根据具体需求选择合适的容器类型

一、底层数据结构

  1. vector(动态数组) 底层:连续内存数组,一块完整堆内存,自动扩容。
  2. list(双向链表) 底层:双向不连续链表,每个节点存数据 + 前后指针,内存分散。
  3. map(有序红黑树) 底层:红黑平衡二叉树,按键 key 自动升序排序,键唯一不可重复。

二、核心性能对比(时间复杂度)

表格

操作vectorlistmap
随机访问 []/at()O (1) 极快不支持随机访问不支持随机访问
头部插入 / 删除O (n)(整体移位)O (1) 极快O(log n)
尾部插入 / 删除均摊 O (1) 极快O(1)O(log n)
中间插入 / 删除O (n)(大量移位)O(1)O(log n)
按值查找O (n) 遍历O (n) 遍历按键查找 O (log n)
内存开销小,仅存数据大,额外存双向指针大,树平衡额外标记

三、基础代码示例

1. vector 动态数组(优先日常容器)

适用:频繁随机读写、尾部增删,很少中间插入

#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> vec;
    vec.push_back(10);  // 尾部添加
    vec.push_back(20);
    vec.insert(vec.begin(), 5); // 头部插入,效率低
    cout << vec[1]; // 随机访问 O(1)

    // 遍历
    for (int x : vec) cout << x;
    return 0;
}

2. list 双向链表

适用:频繁头部 / 中间增删,几乎不随机读取

#include <list>
int main() {
    list<int> lst;
    lst.push_back(1);
    lst.push_front(0); // 头部插入很快
    // 无 lst[0] 这种随机访问,只能迭代器遍历
    for (auto it = lst.begin(); it != lst.end(); ++it) {}
    return 0;
}

3. map 有序键值对

适用:需要key 自动排序、按键快速查找、键不重复

#include <map>
int main() {
    map<string, int> mp;
    mp["张三"] = 18;
    mp["李四"] = 20;
    // 自动按字符串升序排列,按键查询O(logn)
    cout << mp["张三"];
    return 0;
}

四、优缺点总结

vector

✅ 优点:随机访问超快、缓存友好、内存紧凑、遍历速度最快

❌ 缺点:头部 / 中间插入删除大量元素移位,扩容会拷贝数据

场景:数组、缓存、数据批量存储、绝大多数业务首选

list

✅ 优点:任意位置插入删除仅修改指针,无内存拷贝

❌ 缺点:不支持随机访问,遍历慢、内存碎片多、缓存不命中

场景:频繁中间增删、队列节点管理、极少查询下标

map

✅ 优点:key 有序,按键二分查找,插入删除稳定 logn 复杂度

❌ 缺点:不能下标随机遍历 value,树结构内存开销大

场景:字典、有序映射、需要按 key 快速检索的配对数据

五、选型快速口诀

  1. 要下标随机取数据 → vector
  2. 频繁在中间 / 头部删改,不用下标 → list
  3. 存 key-value、需要自动排序、按键查找 → map

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • CreateCompatibleDC()函数案例详解

    CreateCompatibleDC()函数案例详解

    这篇文章主要介绍了CreateCompatibleDC()函数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • c++ lambda捕获this 导致多线程下类释放后还在使用的错误问题

    c++ lambda捕获this 导致多线程下类释放后还在使用的错误问题

    Lambda表达式是现代C++的一个语法糖,挺好用的。但是如果使用不当,会导致内存泄露或潜在的崩溃问题,这里总结下c++ lambda捕获this 导致多线程下类释放后还在使用的错误问题,感兴趣的朋友一起看看吧
    2023-02-02
  • C语言实现班级学生管理系统

    C语言实现班级学生管理系统

    这篇文章主要为大家详细介绍了C语言实现班级学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言植物大战数据结构堆排序图文示例

    C语言植物大战数据结构堆排序图文示例

    这篇文章主要为大家介绍了C语言植物大战数据结构堆排序的图文示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Matlab实现简单扩频语音水印算法详解

    Matlab实现简单扩频语音水印算法详解

    本文主要介绍了通过MATLAB设计并实现一种基于音频的扩频水印算法,从而了解参数对扩频水印算法性能的影响。代码具有一定的价值,感兴趣的小伙伴可以关注一下
    2021-11-11
  • C++中前缀和数组(算法)基本介绍

    C++中前缀和数组(算法)基本介绍

    前缀和(Prefix Sum)是指数组中某个位置之前的所有元素的和,本文将介绍C++中前缀和数组(算法)基本概念,感兴趣的朋友一起看看吧
    2024-12-12
  • QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码

    QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码

    本文主要介绍了QT实现将两个时间相加的算法[hh: mm + hh: mm]的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++实现求动态矩阵各元素的和

    C++实现求动态矩阵各元素的和

    这篇文章主要为大家详细介绍了C++实现求动态矩阵各元素的和,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C++开发绘制正弦曲线的方法

    C++开发绘制正弦曲线的方法

    这篇文章主要为大家详细介绍了C++绘制正弦曲线的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • C语言实现扫雷游戏(可以自动展开)

    C语言实现扫雷游戏(可以自动展开)

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏,可以自动展开,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11

最新评论