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

链表和数组和列表的区别

在C++中,数组(Array)、**链表(LinkedList)列表(List,通常指std::liststd::vector)**是常用的数据结构,但它们的实现和特性有很大区别。下面我将详细解释它们的区别,并用表格总结。


1. 数组(Array)

数组是一种连续内存存储的静态数据结构,大小固定,支持随机访问。

C++ 示例

int arr[5] = {1, 2, 3, 4, 5};  // 静态数组
std::array<int, 5> stdArr = {1, 2, 3, 4, 5};  // C++11 std::array

特点:

  • 内存连续,访问速度快(O(1))。
  • 大小固定,不能动态增长。
  • 插入/删除效率低(需要移动元素,O(n))。

2. 链表(LinkedList)

链表是一种非连续内存存储的动态数据结构,通过指针连接节点,支持高效插入/删除。

C++ 示例(单链表)

struct Node {int data;Node* next;
};Node* head = new Node{1, new Node{2, new Node{3, nullptr}}};

特点:

  • 内存不连续,访问需要遍历(O(n))。
  • 动态大小,可以随时增删节点。
  • 插入/删除高效(O(1),如果已知位置)。

3. 列表(List / Vector)

在C++中,std::list(双向链表)和std::vector(动态数组)是两种不同的“列表”实现:

(1) std::vector(动态数组)

#include <vector>
std::vector<int> vec = {1, 2, 3, 4, 5};

特点:

  • 底层是动态数组,内存连续,支持随机访问(O(1))。
  • 自动扩容(但扩容时可能涉及数据拷贝)。
  • 尾部插入/删除高效(O(1)),中间/头部操作较慢(O(n))

(2) std::list(双向链表)

#include <list>
std::list<int> lst = {1, 2, 3, 4, 5};

特点:

  • 底层是双向链表,内存不连续,不支持随机访问(O(n))。
  • 任意位置插入/删除高效(O(1))
  • 占用更多内存(存储前后指针)

4. 三者的对比(表格总结)

特性数组(Array)链表(LinkedList)std::vectorstd::list
内存布局连续内存非连续内存(指针连接)连续内存(动态)非连续内存(双向链表)
访问方式随机访问(O(1))顺序访问(O(n))随机访问(O(1))顺序访问(O(n))
插入/删除效率O(n)(需移动元素)O(1)(已知位置)尾部O(1),中间O(n)O(1)(任意位置)
动态扩容不支持支持支持(自动扩容)支持
内存开销最小(仅数据)较大(存储指针)较小(可能预留空间)较大(前后指针)
C++标准库实现std::array需手动实现或std::liststd::vectorstd::list

5. 如何选择?

  • 需要快速随机访问?std::vector(动态数组)。
  • 频繁在中间插入/删除?std::list(链表)。
  • 固定大小且需高性能?原生数组或std::array
    在这里插入图片描述
http://www.dtcms.com/a/271135.html

相关文章:

  • 力扣网编程150题:加油站(贪心解法)
  • Origin将Y偏移图升级为双Y轴3D瀑布图
  • SAP-ABAP:SAP中‘SELECT...WHERE...IN’语句IN的用法详解
  • 想要抢早期筹码?FourMeme专区批量交易教学
  • Cadence模块复用
  • SQL 视图与事务知识点详解及练习题
  • 基于Spring Boot+Vue的巴彦淖尔旅游网站(AI问答、腾讯地图API、WebSocket及时通讯、支付宝沙盒支付)
  • 等价矩阵和等价向量组
  • JavaScript基础篇——第五章 对象(最终篇)
  • 深度学习模型在C++平台的部署
  • 优化 FLUX.1 Kontext 以进行低精度量化的图像编辑
  • Flowable17错误事件---------------持续更新中
  • ali linux 安装libreoffice
  • Linux 系统 docker 部署 Dify
  • Airtest 的 Poco 框架中,offspring()
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_ecn
  • Protable 问题记录
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | ROM、RAM、FIFO 的使用
  • 使用DDR4控制器实现多通道数据读写(十九)
  • 通过Tcl脚本命令:set_param labtools.auto_update_hardware 0
  • 闲庭信步使用图像验证平台加速FPGA的开发:第六课——测试图案的FPGA实现
  • 闲庭信步使用图像验证平台加速FPGA的开发:第七课——获取RAW图像
  • RAM带宽计算及分析
  • 双esp8266-01s间TCP通讯
  • 云服务器域名可以设置多少二级域名
  • 为什么Spring中推荐使用构造函数而不是@Autowired字段注入
  • WIFI协议全解析04:从芯片角度看WiFi协议:ESP32/8266 支持了哪些?
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘re’问题
  • python学习打卡:DAY 25 异常处理
  • 在 PyCharm 中安装并配置 Node.js 的指南