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

C++ STL 容器

C++ 的 STL(Standard Template Library) 提供了多种容器,分为以下几类:

  1. 序列容器(Sequence Containers)
  2. 关联容器(Associative Containers)
  3. 无序关联容器(Unordered Associative Containers)
  4. 容器适配器(Container Adapters)

以下是常见 STL 容器的分类、内部实现和时间复杂度:


1. 序列容器(Sequence Containers)

序列容器按顺序存储元素,允许在任意位置插入和删除。

(1)std::vector

  • 内部实现:动态数组。
  • 特点
    • 内存连续,支持随机访问。
    • 尾部插入和删除效率高,中间插入和删除效率低。
  • 时间复杂度
    • 访问元素:O(1)
    • 尾部插入/删除:O(1)(均摊)
    • 中间插入/删除:O(n)

(2)std::deque

  • 内部实现:分段连续空间(双端队列)。
  • 特点
    • 支持高效的头尾插入和删除。
    • 内存非完全连续,但支持随机访问。
  • 时间复杂度
    • 访问元素:O(1)
    • 头尾插入/删除:O(1)
    • 中间插入/删除:O(n)

(3)std::list

  • 内部实现:双向链表。
  • 特点
    • 支持高效的元素插入和删除。
    • 不支持随机访问。
  • 时间复杂度
    • 插入/删除元素:O(1)(已知位置)
    • 访问元素:O(n)

(4)std::forward_list

  • 内部实现:单向链表。
  • 特点
    • std::list 更节省内存。
    • 只支持单向遍历。
  • 时间复杂度
    • 插入/删除元素:O(1)(已知位置)
    • 访问元素:O(n)

2. 关联容器(Associative Containers)

关联容器按键(key)排序,支持高效查找。

(1)std::set

  • 内部实现:红黑树(平衡二叉搜索树)。
  • 特点
    • 元素唯一,按值排序。
  • 时间复杂度
    • 插入/删除/查找:O(log n)

(2)std::multiset

  • 内部实现:红黑树。
  • 特点
    • 允许重复元素,按值排序。
  • 时间复杂度
    • 插入/删除/查找:O(log n)

(3)std::map

  • 内部实现:红黑树。
  • 特点
    • 键值对存储,按键排序。
  • 时间复杂度
    • 插入/删除/查找:O(log n)

(4)std::multimap

  • 内部实现:红黑树。
  • 特点
    • 允许重复键,按键排序。
  • 时间复杂度
    • 插入/删除/查找:O(log n)

3. 无序关联容器(Unordered Associative Containers)

无序关联容器使用哈希表实现,支持高效查找。

(1)std::unordered_set

  • 内部实现:哈希表。
  • 特点
    • 元素唯一,无序存储。
  • 时间复杂度
    • 插入/删除/查找:平均 O(1),最坏 O(n)

(2)std::unordered_multiset

  • 内部实现:哈希表。
  • 特点
    • 允许重复元素,无序存储。
  • 时间复杂度
    • 插入/删除/查找:平均 O(1),最坏 O(n)

(3)std::unordered_map

  • 内部实现:哈希表。
  • 特点
    • 键值对存储,无序存储。
  • 时间复杂度
    • 插入/删除/查找:平均 O(1),最坏 O(n)

(4)std::unordered_multimap

  • 内部实现:哈希表。
  • 特点
    • 允许重复键,无序存储。
  • 时间复杂度
    • 插入/删除/查找:平均 O(1),最坏 O(n)

4. 容器适配器(Container Adapters)

容器适配器基于其他容器实现,提供特定接口。

(1)std::stack

  • 内部实现:默认基于 std::deque
  • 特点
    • 后进先出(LIFO)。
  • 时间复杂度
    • 插入/删除:O(1)
    • 访问栈顶元素:O(1)

(2)std::queue

  • 内部实现:默认基于 std::deque
  • 特点
    • 先进先出(FIFO)。
  • 时间复杂度
    • 插入/删除:O(1)
    • 访问队首元素:O(1)

(3)std::priority_queue

  • 内部实现:默认基于 std::vector,使用堆(heap)实现。
  • 特点
    • 元素按优先级排序,默认最大堆。
  • 时间复杂度
    • 插入:O(log n)
    • 删除:O(log n)
    • 访问堆顶元素:O(1)

总结

容器类型容器名称内部实现访问插入/删除查找
序列容器std::vector动态数组O(1)O(n)/O(1)-
std::deque分段连续空间O(1)O(n)/O(1)-
std::list双向链表O(n)O(1)-
std::forward_list单向链表O(n)O(1)-
关联容器std::set红黑树-O(log n)O(log n)
std::multiset红黑树-O(log n)O(log n)
std::map红黑树-O(log n)O(log n)
std::multimap红黑树-O(log n)O(log n)
无序关联容器std::unordered_set哈希表-O(1)/O(n)O(1)/O(n)
std::unordered_multiset哈希表-O(1)/O(n)O(1)/O(n)
std::unordered_map哈希表-O(1)/O(n)O(1)/O(n)
std::unordered_multimap哈希表-O(1)/O(n)O(1)/O(n)
容器适配器std::stack默认 std::dequeO(1)O(1)-
std::queue默认 std::dequeO(1)O(1)-
std::priority_queue默认 std::vectorO(1)O(log n)-

根据需求选择合适的容器,可以显著提高程序性能。

以下为各种时间复杂度的趋势对比图,供参考。
在这里插入图片描述

http://www.lryc.cn/news/537124.html

相关文章:

  • 开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码
  • CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display
  • K8s组件
  • python面试题
  • AOS安装及操作演示
  • 蓝桥杯单片机组第十三届初赛试题-程序题(第2批)
  • 企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略
  • Python Pandas(11):Pandas 数据可视化
  • 【练习】图论
  • 【RAG落地利器】Weaviate、Milvus、Qdrant 和 Chroma 向量数据库对比
  • 今日AI和商界事件(2025-02-14)
  • 【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用
  • spring6(完结)
  • Kubernetes (k8s) 常用指令速查表
  • DeepSeek教unity------MessagePack-05
  • Kotlin 优雅的接口实现
  • 新的面试题CSS
  • DeepSeek R1打造本地化RAG知识库
  • 聚铭网络入围2025年度江苏省政府采购信息安全设备协议供货名单
  • 基于Flask的影视剧热度数据可视化分析系统的设计与实现
  • 【弹性计算】弹性计算的技术架构
  • python-leetcode 31.K个一组翻转链表
  • 算法08-递归调用转为循环的通用方法
  • [创业之路-300]:进一步理解货币与金钱, 货币与货币政策
  • 达梦:跟踪日志诊断
  • Qwen2-VL 的重大省级,Qwen 发布新旗舰视觉语言模型 Qwen2.5-VL
  • js考核第三题
  • LabVIEW袜品压力测试系统
  • jsp页面跳转失败
  • 1.推荐算法基本概念