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

从零开始手写STL库:Map

从零开始手写STL库–Map的实现

Github链接:miniSTL


文章目录

  • 从零开始手写STL库–Map的实现
  • 一、Map是什么
  • 二、Set要包含什么函数
  • 总结

一、Map是什么

std::map是基于红黑树构建的数组结构,能够储存键和值这样的数据对,并且不允许重复元素的存在

二、Set要包含什么函数

基于本流程中实现过的红黑树,封装一层就可以了

不过这里额外实现一下std::map的访问方式,也就是atoperator[]的实现

正常的封装一下插入删除查找等函数:

template<typenameKey,typenameValue>classmyMap{private:myRedBlackTree<Key,Value>rbTree;public:Map():rbTree(){}~Map(){}voidinsert(constKey&key,constValue&value){rbTree.insert(key,value);}voiderase(constKey&key){rbTree.remove(key);}size_tsize(){returnrbTree.getSize();}boolempty()const{returnrbTree.empty();}boolcontains(constKey&key){returnrbTree.at(key)!=nullptr;}};

关于at的实现则调用红黑树的查找函数,如下:

Value&at(constKey&key){Value*foundVal=rbTree.at(key);if(foundVal){return*foundVal;}else{throwstd::out_of_range("Key not found");}}

同样的,operator[]的重构也调用at函数,如下:

Value&operator[](constKey&key){Value*foundVal=rbTree.at(key);if(foundVal)return*foundVal;else{Value defaultValue;rbTree.insert(key,defaultValue);return*rbTree.at(key);}}

不同的在于,如果operator[]访问发现没有这个元素,会将该元素插入进树中

这里也是符合STL库的使用规范的,因为在STL库中,虽然at和[]都可以访问元素,但是原理是不同的

在vector中:
at()访问会做边界检查,如果越界会抛出异常,相对来说安全
operator[]不会,即便是越界也会返回一个引用,只是这个引用必然是错误的,基于该返回值做什么操作都有些危险

在map中:
operator[]会检查元素是否存在,如果不存在就插入该元素,并返回引用

所以这里的实现就将这一过程复现了,关于operator[]的知识点,在Effective STL的第二十四条中也有介绍:Effective STL

有关map的插入效率问题,可以串联起来看

总结

map的查找删除搜索效率一样,都是O(logn),这是由于它是由红黑树为底层构建的

还需要注意一个问题:如果std::map的键类型是自定义类型,需要怎么做?

答案是重载operator<或者定义比较函数,不过根据Effective STL的意见,更合适的方式是定义比较函数

不过两者均可,不考虑别的程序员可能误解代码的情况下,使用哪个方法都可以,如:

structmyCompare{booloperator()(constmyKey&a,constmyKey&b)const{returna.key<b.key;}};std::map<myKey,int,myCompare>myMap;

或者:

structmyKey{intkey;booloperator<(constmyKey&other)const{returnkey<other.key;}};std::map<myKey,int>myMap;
http://www.jsqmd.com/news/1322053/

相关文章:

  • Unity场景优化全攻略:从性能分析到实战技巧解决卡顿问题
  • 2026年个人公众号迁移代办机构哪个好?在线办理指南 - 跑政通
  • UnityNativeCamera高级配置:分辨率、质量与存储路径优化技巧
  • Unity Mesh优化插件:从顶点合并到LOD生成的性能提升实战
  • 父母一方不陪同出境?出行同意书公证线上远程视频办理攻略(附材料清单)
  • 北京产业园代办哪家正规:【博亚信诚】专业稳妥 - 17728098551
  • TRELLIS.2数据集制作:ObjaverseXL到O-Voxel格式转换教程
  • 2026年纳米橡塑减振隔声板选购全指南:市场格局、评估框架与主流品牌平行参考 - 广华节能科技有限公司
  • InsForge技术深度评测:开源BaaS平台的架构设计与性能实战
  • UE5 AssetManager核心机制解析:异步加载、内存管理与实战配置
  • Visual Studio 2022配置SDL2开发环境:从零到图形程序实战
  • YOLOv11改进 | 主干/Backbone篇 | 目标检测网络FasterNeT轻量化网络助力yolov11改进(提高FPS和检测效率)
  • 虚幻引擎GConfig配置系统深度解析:从源码到工程实践
  • 用Python Pygame实现平台跳跃游戏:从重力模拟到手感调优
  • 微信发起投票两种完整方式,西瓜评选保姆级分步实操教程 - 投票小程序
  • Unity原生C#热更新实战:HybridCLR原理、踩坑与最佳实践
  • 北京产业园入驻流程哪家服务省心:【博亚信诚】一站式办 - 18102756859
  • Wandb_Tutorial与PyTorch无缝集成:训练过程监控与模型性能分析实战
  • 决策树与随机森林:从核心原理到实战调优的完整指南
  • Budibase:零代码构建企业级AI自动化应用的终极指南
  • macOS系统升级后Mac Mouse Fix功能失效?5步完整恢复指南
  • Flutter图片下载与本地保存:从网络请求到文件系统的完整实现方案
  • 2026年全国初中生专属AI研学营生涯规划榜单汇总 - 互联网科技品牌测评
  • 如何在15分钟内免费搭建餐饮点餐小程序:bee开源系统完整指南
  • OBJ模型轻量化实战:从原理到工具选型与性能优化
  • Tabler后台模板搭建:Docker容器化部署全过程
  • SQL注入自动化测试:双引号闭合场景实战解析
  • 3分钟搞定!Windows 10/11苹果USB驱动终极安装指南
  • OTT文档详解:开发者必看的API接口与参数配置指南
  • 【AI时代新职业掘金指南】:2023-2025年全球新增47类高薪岗位清单(附准入门槛与成长路径)