C++(16)——map和set
map和set1. 关联式容器在我们之前接触过的STL中的容器中比如vector、list、deque这些容器统称为序列式容器其底层为线性序列的数据结构存储的是元素本身。关联式容器存储的是key,value结构的键值对在数据检索时比序列式容器效率更高。2. 键值对用来表示一一对应关系的一种结构该结构中一般只包含两个成员变量key和valuekey代表键值value表示与key对应的信息。SGI-STL中关于键值对的定义template class T1, class T2 struct pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; pair(): first(T1()), second(T2()) {} pair(const T1 a, const T2 b): first(a), second(b) {} };3. 树形结构的关联式容器STL实现了两种不同结构的管理式容器树型结构和哈希结构。其中树型结构的关联式容器主要有四种map、set、multiset、multimap。这四种容器的共同点是使用平衡搜索树即红黑树作为其底层结构容器中的元素是一个有序的序列。3.1 set3.1.1 介绍set文档介绍1. set中只放value底层实际存放的是value,value构成的键值对2. 插入元素时只需要插入value3. set中的元素不可重复可以用来去重4. set中的元素默认按照小于来比较使用迭代器遍历可以得到有序序列5. 查找元素的时间复杂度是6. set的元素不允许修改7. 底层通常用平衡二叉搜索树红黑树来实现3.1.2 使用1. 模板参数列表Tset中存放元素的类型Compare比较类型定义比较方式默认小于Allocset中元素空间的管理方式使用STL提供的空间配置器2. 构造函数声明功能介绍set (const Compare comp Compare(),const Allocator Allocator() );构造空的setset (InputIterator first, InputIterator last, const Compare comp Compare(), const Allocator Allocator() );用[first, last)区间中的元素构造setset ( const setKey,Compare,Allocator x);set的拷贝构造3. 迭代器函数声明功能介绍iterator begin()返回set中起始位置元素的迭代器iterator end()返回set中最后一个元素后面的迭代器const_iterator cbegin() const返回set中起始位置元素的const迭代器const_iterator cend() const返回set中最后一个元素后面的const迭代器reverse_iterator rbegin()返回set第一个元素的反向迭代器即endreverse_iterator rend()返回set最后一个元素下一个位置的反向迭代器即rbeginconst_reverse_iterator crbegin() const返回set最后一个元素下一个位置的反向const迭代器即crbegin4. 容量函数声明功能介绍bool empty ( ) const检测set是否为空空返回true否则返回truesize_type size() const返回set中有效元素的个数5. 修改操作函数声明功能介绍pairiterator,bool insert ( const value_type x )在set中插入元素x实际插入的是x, x构成的键值对如果插入成功返回该元素在set中的位置true,如果插入失败说明x在set中已经存在返回x在set中的位置falsevoid erase ( iterator position )删除set中position位置上的元素size_type erase ( const key_type x )删除set中值为x的元素返回删除的元素的个数void erase ( iterator first, iterator last )删除set中[first, last)区间中的元素void swap ( setKey,Compare,Allocator st );返回set第一个元素的反向迭代器即endvoid clear ( )将set中的元素清空iterator find ( const key_type x ) const返回set中值为x的元素的位置size_type count ( const key_type x ) const返回set中值为x的元素的个数3.2 map3.2.1 介绍map文档介绍1. map中存放的是键值对keyvalue2. map中的key是唯一的不能修改3. map中的元素默认按照小于的方式对键值key进行比较排序4. map允许按顺序对元素进行迭代可以得到一个有序序列5. map支持下标访问通过key访问对应的valueoperator[]中实际进行插入查找6. 底层通常用平衡二叉搜索树实现3.2.2 使用1. 模板参数列表Key键值对中key的类型T键值对中T的类型Compare比较器类型map中的元素按照key来比较默认按照小于比Alloc通过空间配置器来申请底层空间2.构造函数声明功能介绍map (const Compare comp Compare(),const Allocator Allocator() );构造空的mapmap (InputIterator first, InputIterator last, const Compare comp Compare(), const Allocator Allocator() );用[first, last)区间中的元素构造mapmap ( const mapKey,Compare,Allocator x);map的拷贝构造3. 迭代器函数声明功能介绍begin()和end()begin:首元素的位置 end最后一个元素的下一个位置cbegin()和cend()与begin和end意义相同但cbegin和cend所指向的元素不能修改rbegin()和rend()反向迭代器rbegin在end位置rend在begin位置其和--操作与begin和end操作移动相反crbegin()和crend()与rbegin和rend位置相同操作相同但crbegin和crend所指向的元素不能修改4. 容量与元素访问函数声明功能介绍bool empty ( ) const检测map中的元素是否为空是返回size_type size() const返回map中有效元素的个数mapped_type operator[] (const key_type k)返回去key对应的value5.修改操作函数声明功能介绍pairiterator,bool insert ( const value_type x )在map中插入键值对x注意x是一个键值对返回值也是键值对iterator代表新插入元素的位置bool代表释放插入成功void erase ( iterator position )删除map中position位置上的元素size_type erase ( const key_type x )删除map中值为x的元素返回删除的元素的个数void erase ( iterator first, iterator last )删除set中[first, last)区间中的元素void swap ( setKey,Compare,Allocator st );交换两个map中的元素void clear ( )将map中的元素清空iterator find ( const key_type x ) const在map中插入key为x的元素找到返回该元素的位置的迭代器否则返回endconst_iterator find ( const key_type x ) const在map中插入key为x的元素找到返回该元素的位置的const迭代器否则返回cendsize_type count ( const key_type x ) const返回key为x的键值在map中的个数注意map中key是唯一的因此该函数的返回值要么为0要么为1因此也可以用该函数来检测一个key是否在map中3.3 multisetmultiset文档介绍与set的不同mulitset的元素允许重复其余内容与set基本一致3.4 multimapmultimap文档介绍与map的不同key允许重复不支持下标访问其余内容与map基本一致4. 底层结构4.1 AVL树4.1.1 概念一棵二叉搜索树满足每个节点的左右子树高度差平衡因子的绝对值不超过1即为AVL树4.1.2 定义templateclass T struct AVLTreeNode { AVLTreeNode(const T data) : _pLeft(nullptr), _pRight(nullptr), _pParent(nullptr) , _data(data), _bf(0) {} AVLTreeNodeT* _pLeft; // 该节点的左孩子 AVLTreeNodeT* _pRight; // 该节点的右孩子 AVLTreeNodeT* _pParent; // 该节点的双亲 T _data; int _bf; // 该节点的平衡因子 };4.1.3 插入操作插入操作可分为两步1. 按照二叉搜索树的方式插入新节点2. 调整节点的平衡因子插入新节点后可能导致不平衡因此需要调整树的结构根据插入的位置不同分别有四种旋转方式1. 新节点插入较高左子树的左侧——左左右单旋2. 新节点插入较高右子树的右侧——右右左单旋3. 新节点插入较高左子树的右侧——左右先左单旋再右单旋左右双旋4. 新节点插入较高右子树的左侧——右左先右单旋再左单旋右左双旋最后需要验证是否为AVL树可分为两步1. 验证是否为二叉搜索树中序遍历是否得到一个有序队列2. 验证是否为平衡树1. 每个节点子树高度差的绝对值是否不超过12. 节点的平衡因子是否计算正确4.1.4 性能查找的时间复杂度由于需要保持平衡因此进行修改操作时性能低下4.2 红黑树4.2.1 概念一棵二叉搜索树在每个节点上增加一个存储位表示节点的颜色red或black确保没有一条路径会比其他路径长出两倍因而接近平衡即为红黑树4.2.2 性质1. 每个节点不是红色就是黑色2. 根节点时黑色3. 如果一个节点是红色则它的两个孩子节点是黑色的4. 对于每个节点从该节点到其所有后代叶节点的简单路径上均包含相同数目的黑色节点5. 每个叶子节点空节点都是黑色的4.2.3 定义// 节点的颜色 enum Color{RED, BLACK}; // 红黑树节点的定义 templateclass ValueType struct RBTreeNode { RBTreeNode(const ValueType data ValueType()Color color RED) : _pLeft(nullptr), _pRight(nullptr), _pParent(nullptr) , _data(data), _color(color) {} RBTreeNodeValueType* _pLeft; // 节点的左孩子 RBTreeNodeValueType* _pRight; // 节点的右孩子 RBTreeNodeValueType* _pParent; // 节点的双亲(红黑树需要旋转为了实现简单给 出该字段) ValueType _data; // 节点的值域 Color _color; // 节点的颜色 };4.2.3 插入操作插入操作可分为两步1. 按照二叉搜索树的方式插入新节点2. 检查新节点插入后红黑树的性质是否遭到破坏新节点的颜色默认为红色当新节点的父节点颜色为红色时即违反了性质三此时需分情况讨论约定cur为当前节点p为父节点g为祖父节点u为叔叔节点情况一cur为红p为红g为黑u存在且为红解决方式将pu改为黑g改为红g作为cur继续向上调整情况二cur为红p为红g为黑u不存在或存在且为黑若p为g的左孩子cur为p的左孩子进行右单旋相反若p为g的右孩子cur为p的右孩子进行左单旋p变黑g变红情况三cur为红p为红g为黑u不存在或存在且为黑若p为g的左孩子cur为p的右孩子进行左单旋相反若p为g的右孩子cur为p的左孩子进行右单旋则转换为情况二验证1. 验证是否为二叉搜索树2. 验证是否满足红黑树的性质4.3 AVL树与红黑树的比较二者都是高效的二叉搜索树增删查改的时间复杂度都是红黑树不追求决定平衡相对而言降低了插入和旋转的次数所有性能比AVL树更优且实现相对简单4.4 红黑树的迭代器begin()和end()begin()放在红黑树中最小节点最左侧节点的位置end()放在最大节点的下一个位置即头节点的位置operator()和operator--() 找迭代器的下一个节点分两种情况情况一右子树存在找左子树中最小的节点即左子树中最小节点情况二右子树不存在向上查找直到当前节点不为其父节点的右子树特殊情况根节点没有右子树-- 找迭代器的上一个节点分三种情况情况一左子树存在找左子树中最大的节点即左子树中最右节点情况二左子树不存在向上查找直到当前节点不为其父节点的左子树情况三 当前在head位置上一个节点指向最大节点位置

相关新闻

Visual Studio安装教程

Visual Studio安装教程

一、下载官网地址:https://visualstudio.microsoft.com/zh-hans/downloads/因为是自用的,这里我们选择社区版本。双击打开后,会加载一些东西。最后出现下面的界面:二、安装visual studio(一)更改安装路径首…

2026/8/21 19:54:06 阅读更多 →
从概念到实体:技术项目落地的三层转换与避坑指南

从概念到实体:技术项目落地的三层转换与避坑指南

你点开这篇文章,可能以为我要讲一个关于美剧《识骨寻踪》的幕后花絮。没错,标题确实指向了2013年圣地亚哥国际动漫展上,关于剧中“骨头”制作的一个小故事。但我想聊的,远不止于此。 作为一个长期与技术、数据和内容打交道的人&a…

2026/8/21 19:53:06 阅读更多 →
三步保存视频号视频:免费开源资源嗅探下载工具的完整上手指南

三步保存视频号视频:免费开源资源嗅探下载工具的完整上手指南

三步保存视频号视频:免费开源资源嗅探下载工具的完整上手指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 深夜…

2026/8/21 19:53:06 阅读更多 →

最新新闻

文档切分算法详解

文档切分算法详解

一、算法概述 文档切分(Document Chunking)是将长文档分割成适合检索的小段落(chunks)的过程。这是RAG(检索增强生成)系统中最基础也最关键的环节之一。好的文档切分策略直接影响后续检索的准确性和生成的质…

2026/8/21 20:39:25 阅读更多 →
OpenDocMan 快速上手指南:10 分钟部署一套 PHP 文档管理系统

OpenDocMan 快速上手指南:10 分钟部署一套 PHP 文档管理系统

OpenDocMan 快速上手指南:10 分钟部署一套 PHP 文档管理系统 【免费下载链接】opendocman OpenDocMan - Free PHP Document Management System DMS 项目地址: https://gitcode.com/gh_mirrors/op/opendocman OpenDocMan 是一款免费的开源 PHP 文档管理系统&a…

2026/8/21 20:39:25 阅读更多 →
Deming回归结果解读:方法比较中的比例偏差与恒定偏差

Deming回归结果解读:方法比较中的比例偏差与恒定偏差

Deming回归分析结果解读一、Deming回归分析概述Deming回归(Deming Regression)是一种用于两种测量方法一致性评价的统计技术,也称为一致性回归。在医学检验、实验室方法比对等场景中,研究者常需要评估新测量方法与参考方法之间是否…

2026/8/21 20:39:25 阅读更多 →
Java面试突击手册:高频考点与高效备战指南

Java面试突击手册:高频考点与高效备战指南

1. 为什么需要Java面试突击手册? 最近三年Java技术岗的竞争激烈程度有目共睹。去年某大厂校招数据显示,平均每个Java开发岗位会收到超过200份简历,而最终能通过全部技术面试的不足5人。在这样的环境下,一本系统化的面试突击手册就…

2026/8/21 20:39:25 阅读更多 →
实习第三十七天日记周五【2026.8.21】

实习第三十七天日记周五【2026.8.21】

例行早会一、各项目开发进展汇报1. 规则表格补充延续规则合并汇总工作:昨日新增两个表格,其中一个表格包含 88 条规则,已添加完成;今日进行测试,若无问题将再补充最后一个表格。2. 旧项目迁移后端框架迁移后的测试工作…

2026/8/21 20:39:25 阅读更多 →
DeepSeek Harness 小白入门 48:升级不翻车:版本锁定、CHANGELOG 与回归探针

DeepSeek Harness 小白入门 48:升级不翻车:版本锁定、CHANGELOG 与回归探针

DeepSeek Harness 小白入门 48:升级不翻车:版本锁定、CHANGELOG 与回归探针 [!NOTE] 这是 第四阶段 项目实战 的第 48 课。本文面向第一次接触 Agent Harness 的读者,目标是:把第三方库升级变成可回滚的受控变更。真实练习场景是:从 0.2.0 升级未来版本前生成对比报告。全…

2026/8/21 20:38:25 阅读更多 →

日新闻

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

机场边检旅客定位系统国产化白皮书:算法、硬件、底座平台全程自主

前言随着国家数字基础设施信创替代、关键技术自主可控战略持续深化,口岸智慧安防、边检智能管控领域正全面进入国产化、自主化、安全可控升级周期。当前国内机场边检旅客识别与定位体系长期依赖国外商用视觉算法、进口成像硬件、闭源通用计算平台,存在核…

2026/8/21 0:00:42 阅读更多 →
别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱

别再把“数字孪生”当空间智能了!镜像视界揭开四维时空的真正面纱当下数字化建设浪潮中,很多项目将三维可视化、视频贴图叠加的数字孪生等同于空间智能。传统数字孪生更多停留在三维场景复刻,擅长把物理世界“画出来、展示出来”,…

2026/8/21 0:00:42 阅读更多 →
105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40°C到85°C的影像质量一致性——ISP参数温漂补偿与产线标定策略

105、车载温度范围-40C到85C的影像质量一致性——ISP参数温漂补偿与产线标定策略 去年冬天在北方某车厂做A样评审,凌晨四点的黑河试验场,零下三十三度。客户拿了一台冷启动的车,中控屏上倒车影像全是雪花噪点,暗部细节直接糊成一片。我第一反应是sensor温度没上来,暗电流…

2026/8/21 0:00:42 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/21 3:21:33 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/21 0:02:09 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/21 6:07:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/21 16:42:28 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/20 21:46:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/21 0:14:22 阅读更多 →