C++之vector和list辨析

std::vectorstd::list 是 C++ 标准库中两种常用的容器,它们都用于存储和管理元素集合,但在底层实现和性能特性上有显著的区别。

1. 底层实现

  • std::vector :
    • 基于动态数组实现。
    • 元素在内存中是连续存储的。
    • 支持随机访问(通过下标访问元素)。
    • 当容量不足时,会重新分配更大的内存块,并将所有元素复制到新内存中。
  • std::list :
    • 基于双向链表实现。
    • 元素在内存中是非连续存储的,每个元素包含指向前后元素的指针。
    • 不支持随机访问,只能通过迭代器顺序访问。
    • 插入和删除操作不会导致内存重新分配。

2. 性能特性

操作 std::vector std::list
随机访问 O(1)(通过下标直接访问) O(n)(需要遍历链表)
尾部插入/删除 O(1)(如果不需要扩容) O(1)
头部插入/删除 O(n)(需要移动所有元素) O(1)
中间插入/删除 O(n)(需要移动部分元素) O(1)(找到位置后直接插入/删除)
内存占用 较小(仅存储元素,无额外开销) 较大(每个元素需要额外存储两个指针)
缓存友好性 高(元素连续存储,缓存命中率高) 低(元素非连续存储,缓存命中率低)

3. 适用场景

  • std::vector :
    • 需要频繁随机访问元素的场景。
    • 元素数量变化不大,或者主要在尾部插入/删除元素的场景。
    • 对缓存性能要求高的场景。
  • std::list :
    • 需要频繁在任意位置插入/删除元素的场景。
    • 不需要随机访问元素的场景。
    • 元素数量变化较大的场景。

4. 实例

cpp 复制代码
#include <iostream>
#include <vector>
#include <list>

int main() {
    // std::vector 示例
    std::vector<int> vec = {1, 2, 3};
    vec.push_back(4); // 尾部插入
    vec.insert(vec.begin() + 1, 5); // 中间插入
    std::cout << "Vector: ";
    for (int v : vec) std::cout << v << " "; // 随机访问
    std::cout << std::endl;

    // std::list 示例
    std::list<int> lst = {1, 2, 3};
    lst.push_back(4); // 尾部插入
    lst.insert(std::next(lst.begin()), 5); // 中间插入
    std::cout << "List: ";
    for (int l : lst) std::cout << l << " "; // 顺序访问
    std::cout << std::endl;

    return 0;
}
相关推荐
liulilittle16 分钟前
游戏加速器核心技术:动态超发
开发语言·网络·c++·网络协议·游戏·加速器·游戏加速
Humbunklung44 分钟前
Rust 模块系统:控制作用域与私有性
开发语言·后端·rust
小堃学编程1 小时前
QT跨平台应用程序开发框架(9)—— 容器类控件
开发语言·qt
mit6.8241 小时前
[AI-video] 数据模型与架构 | LLM集成
开发语言·人工智能·python·微服务
hqxstudying1 小时前
Java行为型模式---策略模式
java·开发语言·建造者模式·适配器模式·策略模式
蓝婷儿1 小时前
Python 数据建模与分析项目实战预备 Day 4 - EDA(探索性数据分析)与可视化
开发语言·python·数据分析
爱Java&Java爱我1 小时前
数组:从键盘上输入10个数,合法值为1、2或3,不是这三个数则为非法数字,试编辑统计每个整数和非法数字的个数
java·开发语言·算法
共享家95271 小时前
linux-线程互斥
java·开发语言·jvm
KoiHeng1 小时前
Java对象的比较
java·开发语言
是店小二呀2 小时前
【算法-BFS 解决最短路问题】探索BFS在图论中的应用:最短路径问题的高效解法
算法·图论·宽度优先