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

C++ 基础数据结构与 STL 容器详解

C++ 基础数据结构与 STL 容器详解

C++ 的基础数据结构和 STL 容器是编程的核心基础,不同容器因底层实现不同,适用场景也天差地别。下面我会按「基础数据结构(语言内置)」和「STL 容器(标准库)」两类,清晰讲解它们的底层实现和核心特点,内容兼顾新手易懂性和实用性。

一、C++ 基础数据结构(语言内置)

这类是 C++ 原生支持的基础类型/结构,无复杂封装,是 STL 容器的底层基石。

数据结构底层实现原理核心特点
数组(array)连续的内存空间,元素按索引顺序存储,编译期确定大小(栈/静态区分配)。随机访问 O(1),增删 O(n),大小不可变
指针本质是存储内存地址的变量,通过地址间接访问数据。灵活操作内存,需手动管理,易出越界/野指针问题
结构体(struct)把不同类型数据打包在连续内存中(内存对齐),无额外封装。自定义复合类型,仅数据聚合,无成员函数(可手动加)
示例:原生数组的底层体现
#include <iostream> using namespace std; int main() { // 连续内存存储:地址依次递增(int 占4字节,地址差4) int arr[3] = {10, 20, 30}; cout << "arr[0] 地址:" << &arr[0] << endl; cout << "arr[1] 地址:" << &arr[1] << endl; cout << "arr[2] 地址:" << &arr[2] << endl; // 随机访问:通过 基地址 + 索引*类型大小 直接定位(O(1)) cout << arr[1] << endl; // 等价于 *(arr + 1) return 0; }

二、C++ STL 容器(标准库封装)

STL 容器是对基础数据结构的封装,分为「序列式容器」「关联式容器」「适配器容器」三类,底层实现各有侧重:

1. 序列式容器(按插入顺序存储,元素有序)
容器底层实现原理核心特点适用场景
vector动态数组,连续内存 + 预分配「容量(capacity)」,满了后扩容(通常2倍),重新分配内存并拷贝元素。随机访问 O(1),尾部增删 O(1),中间增删 O(n)频繁读、尾部增删,如数据遍历/统计
list双向循环链表,每个节点包含数据、前驱指针、后继指针,非连续内存。随机访问 O(n),任意位置增删 O(1),无内存浪费频繁插入/删除,如链表操作、任务队列
forward_list单向链表,仅含后继指针,比list更节省内存。仅单向遍历,任意位置增删 O(1),无size()方法内存受限的单向遍历场景
deque分段连续内存(数组 + 缓冲区),底层用「中控数组」管理多个连续缓冲区,首尾各有一个指针。随机访问 O(1),首尾增删 O(1),中间增删 O(n)双端队列、滑动窗口,如队列/栈底层
array封装的静态数组,连续内存,编译期确定大小(栈分配),比原生数组更安全(有边界检查)。同原生数组,不可扩容,支持 STL 算法替代原生数组,需固定大小场景
2. 关联式容器(按键排序,元素无序)

底层依赖「红黑树」或「哈希表」,核心是快速查找:

容器底层实现原理核心特点适用场景
set/multiset红黑树(自平衡二叉搜索树),set键唯一,multiset键可重复,元素自动排序。查找/插入/删除 O(logn),有序,无随机访问有序去重、范围查找,如字典、排序集合
map/multimap红黑树,map键值对(键唯一),multimap键可重复,按键排序。set,通过键访问值键值映射,如配置表、缓存
unordered_set/unordered_multiset哈希表(开链法解决哈希冲突),无自动排序,键唯一/可重复。平均查找/插入/删除 O(1),无序,最坏 O(n)高频查找、无需排序,如去重、存在性判断
unordered_map/unordered_multimap哈希表,键值对,无自动排序,键唯一/可重复。unordered_set,通过键快速查值高频键值查找,如缓存、字典
3. 适配器容器(封装其他容器,改变接口)

无独立底层,依赖上述容器适配:

容器底层依赖(默认)核心特点适用场景
stackdeque后进先出(LIFO),仅支持首尾操作栈操作,如表达式求值、回溯
queuedeque先进先出(FIFO),仅支持首尾操作队列操作,如任务排队、消息队列
priority_queuevector+ 堆(默认大顶堆)优先级最高的元素先出,底层堆排序优先队列,如任务调度、贪心算法

关键补充:核心底层原理拆解

1. 红黑树(set/map底层)

红黑树是「自平衡二叉搜索树」,通过 5 条规则保证平衡(节点红/黑、根黑、叶节点黑、红节点子节点黑、任意节点到叶节点的黑节点数相同),避免二叉搜索树退化成链表,保证操作复杂度稳定在 O(logn)。

2. 哈希表(unordered_*底层)

哈希表通过「哈希函数」将键映射到数组下标,实现 O(1) 访问;若哈希冲突(不同键映射到同一下标),STL 用「开链法」:每个下标对应一个链表,冲突元素存入链表,最坏情况下链表过长会导致操作复杂度 O(n)(可通过扩容缓解)。

3.vector扩容机制

vector初始容量通常为 0/1,满了后扩容为原容量的 1.5~2 倍(不同编译器不同),步骤:

  1. 分配新的更大内存;

  2. 拷贝原元素到新内存;

  3. 释放原内存;

  4. 指向新内存。

⚠️ 扩容会导致迭代器失效,建议提前用reserve()预分配容量。

总结

  1. 连续内存容器array/vector/deque):随机访问快,增删慢,适合读多写少场景;

  2. 链表容器list/forward_list):增删快,访问慢,适合写多读少场景;

  3. 有序关联容器set/map):红黑树实现,有序+稳定 O(logn) 操作;无序关联容器(unordered_*):哈希表实现,无序+平均 O(1) 操作,是高频查找首选;

  4. 适配器容器stack/queue):无独立底层,仅封装接口,按需选择底层容器即可。

核心选择原则:优先根据「访问/增删频率」和「是否有序」选择容器,比如高频查找选unordered_map,有序查找选map,尾部增删选vector

(注:文档部分内容可能由 AI 生成)

http://www.jsqmd.com/news/612492/

相关文章:

  • 高低温拉伸试验机专业制造商推荐:三思试验设备实现0.001~500mm/min无级设定 - 品牌推荐大师1
  • yolov8通过百度飞桨AIstudio平台搭建
  • 向华为学习——解读华为战略规划SP与业务计划BP流程【附全文阅读】
  • XPosed框架安装教程
  • JPEXS Free Flash Decompiler:终极SWF反编译与资源提取工具完全指南
  • 华为项目管理——解读华为客户重大项目管理流程概述【附全文阅读】
  • 涂胶机哪家质量好?2026用户真实口碑与售后网络覆盖对比 - 品牌推荐大师1
  • MTKClient:拯救变砖联发科设备的终极救砖神器
  • 【完整源码+数据集+部署教程】寿司检测检测系统源码 [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • 疲劳驾驶司机异常驾驶行为检测及预警系统 1.开放全部源代码,可自行进行修改 2.提供完整程序打...
  • 深度学习项目训练环境行业落地:医疗影像/农业识别/工业质检等多场景适配
  • Cosmos-Reason1-7B入门指南:面向学生/工程师的本地化推理能力增强工具
  • AI开发-python-langchain框架(--AI 直接生成并执行 Python 代码 )遣
  • Python面试30分钟突击掌握-LeetCode1-Array
  • 嵌入式机器学习模型部署实战:从量化到推理优化
  • 普通话发声技巧
  • Excel批量查询终极指南:告别Ctrl+F,10分钟掌握多文件搜索神器
  • QQ多图片20260408
  • 【完整源码+数据集+部署教程】甘蔗茎节检测检测系统源码 [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
  • 英雄联盟终极工具包:League-Toolkit 完全使用指南
  • 解放文档下载:kill-doc如何让你告别广告与登录的烦恼
  • IMX6ULL开发板学习-01(Linux文件目录和目录相关命令)
  • 从螯肢仿生到精准控制:OpenClaw龙虾机器人运动控制核心,逆解与轨迹规划全揭秘
  • 算法基础应用精讲【深度学习】-基于深度学习的多Agent入侵检测系统(理论篇)
  • 终极指南:3步完成FanControl风扇控制软件中文界面深度配置
  • 2026四川消防维保检测优质服务商推荐榜:消防维保费用、消防验收检测、第三方消防维保、专业消防检测、专业消防维保选择指南 - 优质品牌商家
  • 如何在Windows上一键安装最新版ADB和Fastboot驱动?
  • 终极免费网盘直链解析工具:让下载速度提升5倍的完整指南
  • 向华为学习——解读华为公司人力资源管理体系
  • 2026护发精油推荐:6款适合染烫受损发质的修复神器 - 博客万