从零开始手写STL库:multiset

2024-08-21 08:44

本文主要是介绍从零开始手写STL库:multiset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

Gihub链接:miniSTL


文章目录

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


一、multiset是什么

multiset 是一个有序容器,允许存储多个相同的元素,并按照元素的值进行排序,以红黑树为基础构建。

与set的区别在于,它允许储存重复的元素,而set的元素都是独一无二的。

但是红黑树里面是不允许重复元素的,那要怎么实现这个multiset呢?

实际上multiset并不会真的插入好几个一样的元素,没必要,而且会影响搜索

multiset的红黑树节点会额外的包含一个元素:count

用count的加减来表示元素是否重复,如果插入重复元素,那只需要对conut++即可

二、multiset要包含什么函数

依然是插入删除查找三个函数,不过插入和删除需要注意重复元素的判断

    void insert(const Key &key) {auto count = rbTree.at(key);if (count != nullptr) {(*count)++;sz++;return;}rbTree.insert(key, 1);sz++;}void erase(const Key &key) {auto count = rbTree.at(key);if (count == nullptr) {return;}(*count)--;sz--;if (*count == 0) {rbTree.remove(key);}}

只有当节点不存在时才插入,只有当节点数只有一时才删除

其他功能就是正常的输出

template<typename Key>
class myMultiSet
{
private:myRedBlackTree<Key, size_t> rbtree;size_t sz;public:myMultiSet() : sz(0) {}~myMultiSet() {}void insert(const Key &key) {auto count = rbTree.at(key);if (count != nullptr) {(*count)++;sz++;return;}rbTree.insert(key, 1);sz++;}void erase(const Key &key) {auto count = rbTree.at(key);if (count == nullptr) {return;}(*count)--;sz--;if (*count == 0) {rbTree.remove(key);}}size_t size() const { return sz; }bool empty() const { return sz == 0; }size_t count(const Key &key) {auto num = rbTree.at(key);if (num != nullptr) {return *num;}return 0;}void clear() {sz = 0;rbTree.clear();}    
};

总结

只需要注意重复元素的处理方式即可,也就是用另外的count去记录,而不是真的插入多个相同元素

这篇关于从零开始手写STL库:multiset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092677

相关文章

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

C++ STL 适配器

系列文章目录 模板特例化,偏特化,左右值引用 https://blog.csdn.net/surfaceyan/article/details/126794013 C++ STL 关联容器 https://blog.csdn.net/surfaceyan/article/details/127414434 C++ STL 序列式容器(二) https://blog.csdn.net/surfac

BIRT--商业智能和报表工具,从零开始

1.简介 BIRT (Business Intelligence and Reporting Tools), 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统,特别之处在于它是以 Java 和 JavaEE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。 2.下载 官网下载网址:http://download.ec

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

JS手写实现深拷贝

手写深拷贝 一、通过JSON.stringify二、函数库lodash三、递归实现深拷贝基础递归升级版递归---解决环引用爆栈问题最终版递归---解决其余类型拷贝结果 一、通过JSON.stringify JSON.parse(JSON.stringify(obj))是比较常用的深拷贝方法之一 原理:利用JSON.stringify 将JavaScript对象序列化成为JSO

从零开始学习JVM(七)- StringTable字符串常量池

1 概述 String应该是Java使用最多的类吧,很少有Java程序没有使用到String的。在Java中创建对象是一件挺耗费性能的事,而且我们又经常使用相同的String对象,那么创建这些相同的对象不是白白浪费性能吗。所以就有了StringTable这一特殊的存在,StringTable叫做字符串常量池,用于存放字符串常量,这样当我们使用相同的字符串对象时,就可以直接从StringTable

T1打卡——mnist手写数字识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.定义GPU import tensorflow as tfgpus=tf.config.list_physical_devices("GPU")if gpus:gpu0=gpus[0]tf.config.experimental.set_memort_groth(gpu0,True) #设置GPU现存用量按需

从零开始构建大语言模型并进行微调:全面指南

要从0开始搭建并训练一个大语言模型(LLM),涉及到多个步骤和资源,包括理论理解、工具使用、数据准备、模型训练与微调。以下是一个从基础到应用的指南,帮助你理解并逐步实现这一目标。 1. 理解基础概念 在开始搭建大语言模型之前,了解以下基本概念至关重要: 生成式AI:通过大语言模型生成自然语言文本,例如GPT、BERT等。机器学习:通过数据训练模型,使其具备从数据中学习规律的能力。深度学习:机