从零开始手写STL库:multimap

ops/2024/10/19 19:42:02/

从零开始手写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.ppmy.cn/ops/118103.html

相关文章

leetcode力扣刷题系列——每种字符至少取 K 个

题目 给你一个由字符 ‘a’、‘b’、‘c’ 组成的字符串 s 和一个非负整数 k 。每分钟&#xff0c;你可以选择取走 s 最左侧 还是 最右侧 的那个字符。 你必须取走每种字符 至少 k 个&#xff0c;返回需要的 最少 分钟数&#xff1b;如果无法取到&#xff0c;则返回 -1 。 示…

召回08 双塔模型——线上服务、模型更新

线上召回 离线存储&#xff1a; 模型训练好之后&#xff0c;部署到线上做召回&#xff0c;快速找到用户感兴趣的物品。 对训练好的两个塔&#xff0c;线上服务前&#xff0c;先用右边的物品塔提取物品的特征做离线存储&#xff0c;记作特征向量b&#xff0c;把&#xff08;b…

Linux——pod的控制器

deployment 无状态服务进行部署滚动更新&#xff0c;支持回滚 按照25%的比例进行更新水平扩展和收缩 指定pod副本数量 ---- replicasetstatefulset 有状态服务的部署 固定pod的网络ID 和 持久卷的挂载pod将拥有固定的pod-name eg: 以24 号实验为例&#xff1a; …

MySQL之基础篇

数据库操作 1.查看当前的数据库版本 select version(); 2.显示所有数据库 show databases; 3.创建数据库 create [if not exists] database 数据库名 character set 字符编码集 collate 排序规则&#xff1b; 我们这里提前说一下 被方括号括起来的代码 表示可写可不写 示例…

PostgreSQL分区表

一、分区表的作用 1. 将数据按指定的方法打算到子分区&#xff0c;提高 SQL 性能。 2. 解决时序类、流水类业务大表在进行老旧数据清理时 delete 引起的性能及磁盘空间碎片问题。 3. 利用子分区卸载、重新挂载功能&#xff0c;对数据进行暂时性的隐藏、维护。 4. 数据归档治…

如何优化JVM性能:调优参数技巧

在现代Java应用中&#xff0c;JVM的性能直接影响到应用的整体表现。通过合理配置JVM参数&#xff0c;可以显著提升系统的运行效率。本文将介绍一些常见的JVM参数及其调优技巧&#xff0c;帮助开发者根据应用需求进行优化。 1. 堆内存设置 参数: -Xms&#xff08;初始堆大小&a…

【JAVA-数据结构】初识集合框架

时隔几个月&#xff0c;小主又回来了&#xff0c;近期我们来谈谈数据结构相关内容&#xff0c;这部分数据结构&#xff0c;我们将使用JAVA进行相关讲解&#xff0c;感兴趣的小伙伴持续关注&#xff0c;防止走丢。 1. 什么是集合框架 Java 集合框架 Java Collection Framework &…

LeetCode 35. 搜索插入位置

LeetCode 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target …