尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

从零开始手写STL库:Map

从零开始手写STL库:Map
📅 发布时间:2026/8/3 20:16:42

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

Github链接:miniSTL


文章目录

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

一、Map是什么

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

二、Set要包含什么函数

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

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

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

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;

相关新闻

  • 基于Matlab的验证码识别系统12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • 2026年全国带AI实战课程的夏令营排行 研学营整理 - 互联网科技品牌测评
  • Unity Mesh优化插件:从顶点合并到LOD生成的性能提升实战

最新新闻

  • AI数据闭环系统设计:从标注→特征→反馈的6层一致性保障机制(附NASA级校验清单PDF)
  • 3分钟搞定Windows 11终极广告清理:OFGB免费工具完整使用指南
  • 国奢新中式家具全解析 - 优选案例分享
  • 10个GEKKO优化案例:从参数回归到实时优化的完整实现
  • 基于JUCE框架的音频波形可视化与SVG导出技术实现
  • 游戏IP线下展演xR虚拟制片实战:hecoos xR与UE4高密度拍摄全解析

日新闻

  • 112、LLC谐振变换器的输入电压瞬态仿真分析
  • 2026深圳疑难签证办理指南:拒签再签/商务签/高端定制机构怎么选 - 互联网科技品牌测评
  • C-LODOP在Edge等现代浏览器中的部署、适配与实战应用

周新闻

  • 怀化母婴除甲醛公司测甲醛中心怎么选:康之居母婴除甲醛标准、流程、避坑指南 - 信誉隆金银铂奢回收
  • 三步打造你的终极音乐中心:foobox-cn网络电台功能完整指南
  • Lance湖仓格式:为多模态AI工作流设计的终极数据存储方案

月新闻

  • ClickHouse版本管理深度实战:4步构建零风险升级与回滚体系
  • Java 23 种设计模式:从踩坑到精通 | 番外:责任链模式 —— 物流审批流程实战
  • 华硕笔记本性能解放指南:G-Helper轻量级控制工具全面解析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号