C++之vector和list辨析

news/2025/2/26 5:49:15

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.niftyadmin.cn/n/5868098.html

相关文章

02、Hadoop3.x从入门到放弃,第二章:集群环境搭建

Hadoop3.x从入门到放弃&#xff0c;第二章&#xff1a;集群环境搭建 一、安装JDK并配置环境变量 /etc/profile中部分代码如下&#xff1a; for循环profile.d中的sh文件并使之生效&#xff0c;所以我们只需要在profile.d文件夹下配置我们的my_env.sh文件就好了 vim /etc/prof…

7.grafana的内存和CPU同时在一个表中的调整

如图所示&#xff0c;当CPU和内存同在一个表的时候&#xff0c;左y轴只显示内存单位&#xff0c;那么我们就需要让右y轴显示CPU单位百分之 1. 在axes 中显示左y轴和右y轴 2. 在左y轴单位选择bytes&#xff0c;右y轴单选选择百分比 3. 选择Series overrides&#xff0c;开始填…

手写系列——MoE网络

参考&#xff1a; MOE原理解释及从零实现一个MOE&#xff08;专家混合模型&#xff09;_moe代码-CSDN博客 MoE环游记&#xff1a;1、从几何意义出发 - 科学空间|Scientific Spaces 深度学习之图像分类&#xff08;二十八&#xff09;-- Sparse-MLP(MoE)网络详解_sparse moe…

qtcreator上使用opencv报错

发现是我选择opencv的版本有问题 右键桌面的qtcreator图标&#xff0c;进入Tools目录&#xff0c;可以看到mingw的版本是mingw730_64,因此编译opencv时也要用这个版本 下面是我网上随便找的别人编译好的&#xff0c;发现不行&#xff0c;这个所用的mingw版本也没提&#xff0c…

6. grafana的graph简介

1. Settings功能 2. Visualization功能 &#xff08;可视化的方式&#xff0c;后续会写一些&#xff09; 3. Display 功能&#xff08;显示方面的设置&#xff09; bars 柱状图方式显示 lines&#xff08;不选不会出功能&#xff09; line width 线条的粗细 staircase 会让折…

【IntelliJ IDEA】关于设置固定的文件格式(包括注释、版权信息等)的方法

在IntelliJ IDEA&#xff08;简称IDEA&#xff09;中&#xff0c;要设置固定的文件格式&#xff08;包括注释、版权信息等&#xff09;&#xff0c;使得每次创建新文件时都能自动显示这些内容&#xff0c;可以通过以下步骤实现&#xff1a; 一、设置文件模板 打开IDEA并进入项…

c语言学习,归并排序

C语言&#xff0c;归并排序是经典的分治算法&#xff0c;基本思想是将&#xff0c;待排序的数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;然后将排序好的子数组合并成一个有序的数组。归并排序的时间复杂度为O(n log n)&#xff0c;且具有稳定性。 示…

MFC案例:利用双缓冲技术绘制顶点可移动三角形

案例目标&#xff1a;在屏幕上出现一个三角形&#xff0c;同时显示各顶点坐标&#xff0c;当用鼠标选择某顶点并拖动时&#xff0c;三角形随鼠标移动而变形。具体步骤为&#xff1a; 一、在VS2022上建立一个基于对话框的MFC应用&#xff0c;项目名称&#xff1a;DrawMovableTr…