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

C++之vector和list辨析

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

1. 底层实现

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

2. 性能特性

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

3. 适用场景

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

4. 实例

#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;
}
http://www.dtcms.com/a/37836.html

相关文章:

  • 是德科技keysight N5173B信号发生器,是一款经济高效的仪器
  • MongoDB 数据库简介
  • nnUNet V2代码——nnUNetv2_train命令
  • Fisher信息矩阵(Fisher Information Matrix,简称FIM)
  • python 引用父目录:层级的模块
  • 洛谷B3664[语言月赛202209] 零食售卖点
  • OpenCV(9):视频处理
  • 算法——后缀平衡树
  • Visual Studio Code 跨平台安装与配置指南(附官方下载链接)
  • [Web 信息收集] Web 信息收集 — 手动收集 IP 信息
  • 温湿度监控设备融入智慧物联网
  • Claude-3.7-Sonnet:Cursor 的新引擎,解锁编码与推理的未来
  • Kafka可视化工具EFAK(Kafka-eagle)安装部署
  • leetcode 283. 移动零(详解)双指针c++
  • 一周学会Flask3 Python Web开发-Jinja2模板过滤器使用
  • fps项目总结:角色组件
  • 【教程】使用docker+Dify搭建一个本地知识库
  • 《二分查找:一个数组的“自我修养”》
  • ubuntu20.04 使用nmcli 连接wifi,并且设置永久连接
  • 2025最新Python机器视觉实战:基于OpenCV与深度学习的多功能工业视觉检测系统(附完整代码)
  • redis小记
  • 在 Centos7 上部署 ASP.NET 8.0 + YOLOv11 的踩坑实录
  • AWS CLI将读取器实例添加到Amazon Aurora集群
  • 力扣-动态规划-746 使用最小花费爬楼梯
  • halcon三维点云数据处理(二十六)reduce_object_model_3d_to_visible_parts
  • 如何实现在Redis集群情况下,同一类数据固定保存在同一个Redis实例中
  • 5分钟使用Docker部署Paint Board快速打造专属在线画板应用
  • 从零到一:如何用阿里云百炼和火山引擎搭建专属 AI 助手(DeepSeek)?
  • 《Vue全栈图形绘制系统开发实战》—— 第一章础架构与核心模块实现
  • java项目之网络游戏交易系统源码(ssm+mysql)