当前位置: 首页 > 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)-

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

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

相关文章:

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 向量数据库对比

什么是向量数据库? 向量数据库是一种将数据存储为高维向量的数据库&#xff0c;高维向量是特征或属性的数学表示。每个向量都有一定数量的维度&#xff0c;根据数据的复杂性和粒度&#xff0c;可以从数十到数千不等。 向量通常是通过对原始数据(如文本、图像、音频、视频等)…...

今日AI和商界事件(2025-02-14)

今日AI大事件主要包括以下几个方面&#xff1a; 一、苹果新品预告 事件概述&#xff1a;苹果CEO蒂姆库克在社交媒体发布7秒视频&#xff0c;配文“准备好迎接家庭的新成员”&#xff0c;并宣布2月19日将有新品发布。知名科技记者马克古尔曼称&#xff0c;新款低端iPhone SE将…...

【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用

ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展&#xff0c;大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练&#xff0c;能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...

spring6(完结)

像是八大模式这种&#xff0c;放在后面八股文中再重点了解&#xff0c;对于源码部分也是后面会一起手敲。 个人觉得spring的重点在于注解开发&#xff0c;省去了很多耦合的问题&#xff0c;像是各种事务的管理&#xff0c;和bean类的管理都可以给spring容器管理&#xff0c;注入…...

Kubernetes (k8s) 常用指令速查表

以下是一份 Kubernetes (k8s) 常用指令速查表&#xff0c;涵盖集群管理、资源操作、故障排查等场景&#xff0c;适合日常运维和开发使用&#xff1a; 1. 集群与节点管理 命令说明kubectl cluster-info查看集群基本信息kubectl get nodes查看所有节点状态kubectl describe node…...

DeepSeek教unity------MessagePack-05

动态反序列化 当调用 MessagePackSerializer.Deserialize<object> 或 MessagePackSerializer.Deserialize<dynamic> 时&#xff0c;二进制数据中存在的任何值都将被转换为基本值&#xff0c;即 bool、char、sbyte、byte、short、int、long、ushort、uint、ulong、…...

Kotlin 优雅的接口实现

1. 日常遇到的冗余的接口方法实现 日常开发中&#xff0c;经常会要实现接口&#xff0c;但是很多场景中&#xff0c;只需要用到其中一两个方法&#xff0c;例如 ActivityLifecycleCallbacks&#xff0c;它有很多个接口需要实现&#xff0c;但是很多时候我们只需要用到其中的一…...

新的面试题CSS

解释CSS Hack 一般来说是针对不同的浏览器写不同的CSS,就是 CSS Hack。 IE浏览器Hack一般又分为三种&#xff0c;条件Hack、属性级Hack、选择符Hack&#xff08;详细参考CSS文档&#xff1a;css文档&#xff09;。例如&#xff1a; // 1、条件Hack <!--[if IE]> <sty…...

DeepSeek R1打造本地化RAG知识库

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

聚铭网络入围2025年度江苏省政府采购信息安全设备协议供货名单

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

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...