C++ STL 容器
C++ 的 STL(Standard Template Library) 提供了多种容器,分为以下几类:
- 序列容器(Sequence Containers)
- 关联容器(Associative Containers)
- 无序关联容器(Unordered Associative Containers)
- 容器适配器(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::deque | O(1) | O(1) | - |
std::queue | 默认 std::deque | O(1) | O(1) | - | |
std::priority_queue | 默认 std::vector | O(1) | O(log n) | - |
根据需求选择合适的容器,可以显著提高程序性能。
以下为各种时间复杂度的趋势对比图,供参考。
相关文章:

C++ STL 容器
C 的 STL(Standard Template Library) 提供了多种容器,分为以下几类: 序列容器(Sequence Containers)关联容器(Associative Containers)无序关联容器(Unordered Associa…...
开源赋能,智造未来:Odoo+工业物联网,解锁智能工厂新范式——以真实案例解读制造业数字化转型的降本增效密码
工业物联网的机遇与挑战:为什么企业需要Odoo? 《中国智能制造发展研究报告2023》指出,85%的制造企业已启动数字化转型,但超60%面临“数据孤岛、系统割裂、成本高企”的痛点[1]。传统ERP系统难以实时对接产线设备,而定…...
CTF-WEB: 利用iframe标签利用xss,waf过滤后再转换漏洞-- N1ctf Junior display
核心逻辑 // 获取 URL 查询参数的值 function getQueryParam(param) { // 使用 URLSearchParams 从 URL 查询字符串中提取参数 const urlParams new URLSearchParams(window.location.search); // 返回查询参数的值 return urlParams.get(param); } // 使用 DOMPuri…...

K8s组件
一、Kubernetes 集群架构组件 K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责集群的调度、管理和运维,Slave 节点是集群中的运算工作负载节点。 主节点一般被称为 Master 节点,master节点上有 apis…...
python面试题
以下是一些Python面试题: 一、基础语法 Python中的列表(list)和元组(tuple)有什么区别? 答案: 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。语法:列表使用方括号[]定义,元组使用圆括号()定义(单个元素的元组…...
AOS安装及操作演示
文章目录 一、安装node1.1 在 macOS 上管理 Node版本1.1.1 安装 nvm1.1.2 验证 nvm 是否安装成功1.1.3 使用 nvm 安装/切换 Node.js 版本1.1.4 卸载 Node.js 版本 1.2 在 windows 上管理 Node版本1.2.1 安装 nvm-windows1.2.2 安装 Node.js 版本1.2.3 切换 Node.js 版本1.2.4 卸…...
蓝桥杯单片机组第十三届初赛试题-程序题(第2批)
题目到官网看即可,有点久了有些细节记不清了,可能以前发的帖子解释详细一点。 这是我单片机初学的时候写的,像代码结构什么的肯定有可以提升的地方,多多包涵,将就看一下。 i2c文件使用官方的,pcf8591函数…...

企业级高可用 Kubernetes 实践:基于青云 LB 搭建容灾与负载均衡集群全攻略
一、前言 在企业生产环境,k8s高可用是一个必不可少的特性,其中最通用的场景就是如何在 k8s 集群宕机一个节点的情况下保障服务依旧可用。部署高可用k8s集群对于企业级云平台来说是一个根本性的原则,容错、服务可用和数据安全是高可用基础设施的关键。本文是在青云上利用青云…...

Python Pandas(11):Pandas 数据可视化
数据可视化是数据分析中的重要环节,它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式,数据可视化将复杂的数字和统计信息转化为易于理解的图像,从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...
【练习】图论
F. Friendly Group 图中选择一个点-1 边两端点都选择1 边一个端点选择-1 添加链接描述 #include<iostream> using namespace std; #include<vector> #include<cstring> const int N300010; int n,m; vector<int> G[N]; int temp1,temp2; bool vis[N…...

【RAG落地利器】Weaviate、Milvus、Qdrant 和 Chroma 向量数据库对比
什么是向量数据库? 向量数据库是一种将数据存储为高维向量的数据库,高维向量是特征或属性的数学表示。每个向量都有一定数量的维度,根据数据的复杂性和粒度,可以从数十到数千不等。 向量通常是通过对原始数据(如文本、图像、音频、视频等)…...
今日AI和商界事件(2025-02-14)
今日AI大事件主要包括以下几个方面: 一、苹果新品预告 事件概述:苹果CEO蒂姆库克在社交媒体发布7秒视频,配文“准备好迎接家庭的新成员”,并宣布2月19日将有新品发布。知名科技记者马克古尔曼称,新款低端iPhone SE将…...
【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用
ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展,大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练,能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...

spring6(完结)
像是八大模式这种,放在后面八股文中再重点了解,对于源码部分也是后面会一起手敲。 个人觉得spring的重点在于注解开发,省去了很多耦合的问题,像是各种事务的管理,和bean类的管理都可以给spring容器管理,注入…...
Kubernetes (k8s) 常用指令速查表
以下是一份 Kubernetes (k8s) 常用指令速查表,涵盖集群管理、资源操作、故障排查等场景,适合日常运维和开发使用: 1. 集群与节点管理 命令说明kubectl cluster-info查看集群基本信息kubectl get nodes查看所有节点状态kubectl describe node…...
DeepSeek教unity------MessagePack-05
动态反序列化 当调用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 时,二进制数据中存在的任何值都将被转换为基本值,即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…...
Kotlin 优雅的接口实现
1. 日常遇到的冗余的接口方法实现 日常开发中,经常会要实现接口,但是很多场景中,只需要用到其中一两个方法,例如 ActivityLifecycleCallbacks,它有很多个接口需要实现,但是很多时候我们只需要用到其中的一…...
新的面试题CSS
解释CSS Hack 一般来说是针对不同的浏览器写不同的CSS,就是 CSS Hack。 IE浏览器Hack一般又分为三种,条件Hack、属性级Hack、选择符Hack(详细参考CSS文档:css文档)。例如: // 1、条件Hack <!--[if IE]> <sty…...

DeepSeek R1打造本地化RAG知识库
本文将详细介绍如何使用Ollama、Deepseek R1大语音模型、Nomic-Embed-Text向量模型和AnythingLLM共同搭建一个本地的私有RAG知识库。 一. 准备工作 什么是RAG? RAG是一种结合了信息检索和大模型(LLM)的技术,在对抗大模型幻觉、…...

聚铭网络入围2025年度江苏省政府采购信息安全设备协议供货名单
近日,2025年度江苏省党政机关、事业单位及团体组织信息安全设备框架协议采购项目入围结果公布。聚铭网络凭借自身专业实力和技术优势脱颖而出,成功入围22个分包。 此次采购项目是江苏省政府采购领域级别最高、覆盖面最广的项目之一。从资格评选到后期材料…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...