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

从零开始手写STL库:multimap

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

Gihub链接:miniSTL


文章目录

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


一、multimap是什么?

如图multiset之于set,multimap相当于允许map重复储存键值

所以这里也是增加一个count来计数吗?这里是不可以的

multiset用count是因为key和value相同,而map的key和value是不同的

如果也用count来计数,那么考虑<1,2>和<1,5>的插入,由于key相同,所以后插入的会丢失,这显然不对

所以这里的想法是把红黑树的节点做成list,把所有key相同的值放在一个list中

二、multimap要包含什么函数

明确了设计思路,实际上就是红黑树的一层封装了

如下:

template <typename Key, typename Value> class MultiMap
{
public:
    using ValueType = std::list<Value>; 

    MultiMap() : rbTree(), size(0) {}

    void insert(const Key &key, const Value &value) 
    {
        ValueType *existingValues = rbTree.at(key);
        if (existingValues) existingValues->push_back(value);
        else 
        {
            ValueType values;
            values.push_back(value);
            rbTree.insert(key, values);
        }
        size++;
    }

    void remove(const Key &key) 
    {
        ValueType *existingValues = rbTree.at(key);
        if (existingValues) 
        {
            size -= existingValues->size();
            rbTree.remove(key);
        }
    }

    void remove(const Key &key, const Value &value) 
    {
        ValueType *existingValues = rbTree.at(key);
        if (existingValues) 
        {
            existingValues->remove(value);
            size--;
            if (existingValues->empty()) rbTree.remove(key);
        }
    }

    ValueType *at(const Key &key) { return rbTree.at(key); }

    int getSize() { return size; }

    bool empty() { return size == 0; }

private:
    myRedBlackTree<Key, ValueType> rbTree; 
    size_t size;
};

总结

了解list作为节点代替红黑树常用节点即可,这是multimap实现的基本原理,其他考察点与map相同


http://www.kler.cn/news/333309.html

相关文章:

  • 亚马逊 Bedrock 平台也能使用Llama 3.2 模型了
  • 聊一聊 C#中有趣的 SourceGenerator生成器
  • 常见排序算法汇总
  • 算法笔记(八)——字符串
  • CSS 尺寸 (Dimension)
  • 五子棋双人对战项目(3)——匹配模块
  • django的路由分发
  • ansible用户管理模块和剧本
  • 【Linux】深入理解 Linux 系统命令:网络配置、压缩打包与其他常用命令
  • 芝法酱学习笔记(0.6)——nexus与maven私库
  • ReactJSX使用
  • 【环境配置】科研小白Windows下安装Git
  • 【LeetCode】每日一题 2024_10_5 完成旅途的最少时间(二分答案)
  • 大厂面试真题-介绍以下Docker的Overlay网络
  • 【漏洞复现】泛微OA E-Office do_excel.php 任意文件写入漏洞
  • 模拟算法(1)_替换所有的问号
  • C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验
  • 【Linux】进程优先级、调度、命令行参数:从理论到实践(二)
  • 进程状态及优先级
  • 快速扩展随机数算法