unordered系列容器模拟实现

1.哈希桶

hash.h

#pragma once
#include<iostream>
#include<vector>
using namespace std;template<class T>
struct HashNode
{HashNode(const T& data):_data(data),_next(nullptr){}T _data;HashNode<T>* _next;
};
template<class K>
struct HashFunc
{const K& operator()(const K& key){return key;}
};
template<>
struct HashFunc<string>
{size_t operator()(const string& skey){size_t ret = 0;for (size_t i = 0; i < skey.size(); i++){ret *= 131;ret += skey[i];}return ret;}
};
template<class K, class T, class KOFT, class Hash>
class HashTable;
template<class K, class T, class KOFT, class Hash>
struct __iterator
{KOFT koft;Hash hash;typedef HashNode<T> HashNode;typedef __iterator<K, T, KOFT, Hash> Self;typedef HashTable<K, T, KOFT, Hash> HT;HashNode* _node;HT* _Ht;__iterator(HashNode* h ,HT* pht):_node(h),_Ht(pht){}T& operator*(){return _node->_data;}T* operator->(){return &(_node->_data);}Self operator++(){if (_node->_next)//如果_node的后面不为空{_node = _node->_next;return *this;}else //如果node的后面为空{//向通过data中的key算出映射的位置;int index = hash(koft(_node->_data)) % (_Ht->_ht.capacity());index++;for (; index < (_Ht->_ht.size()); ++index){if (_Ht->_ht[index]){_node = _Ht->_ht[index];return *this;}}_node = nullptr;return *this;}}bool operator!=(const Self& it){return (_node != it._node);}
};template<class K,class T,class KOFT,class Hash>
class HashTable
{
public:friend struct __iterator<K, T, KOFT, Hash>;typedef __iterator<K, T, KOFT, Hash> iterator;KOFT koft;Hash hash;typedef HashNode<T> HashNode;HashTable(size_t initcapacity = 10):_size(0), _ht(initcapacity){}~HashTable(){clear();}iterator begin(){for (size_t i = 0; i < _ht.size(); ++i){if (_ht[i]){return iterator(_ht[i], this);}}return end();}iterator end(){return iterator(nullptr, this);}void clear() //delete掉hash桶中所有new的节点{for (size_t i = 0; i < _ht.capacity(); i++){HashNode* cur = _ht[i];while (cur){HashNode* next = cur->_next;delete cur;cur = next;}_ht[i] = nullptr;}}void Checkcapacity(){//当平衡因子=1时扩容;if (_size == _ht.capacity()){HashTable<K, T, KOFT,Hash> newHash(2 * _ht.capacity());for (size_t i = 0; i < _ht.capacity(); i++){HashNode* cur = _ht[i];while (cur){newHash.insert(cur->_data);cur = cur->_next;}}_ht.swap(newHash._ht);}}pair<iterator,bool> insert(const T& data){//1.Check容量控制平衡因子Checkcapacity();//2.获取indexint index = hash(koft(data)) % _ht.capacity();//3.检查index位置处是否有相同的元素HashNode* cur = _ht[index];while (cur){if (koft(data) == koft(cur->_data)){return make_pair(iterator(cur,this),false);}cur = cur->_next;}//4.头插节点HashNode* newnode = new HashNode(data);newnode->_next = _ht[index];_ht[index] = newnode;++_size;return make_pair(iterator(newnode,this),true);}iterator find(const K& key){int index = hash(key) % _ht.capacity();HashNode* cur = _ht[index];while (cur){if (key == koft(cur->_data)){return iterator(cur,this);}cur = cur->_next;}return iterator(nullptr);}bool erase(const K& key){int index =hash(key) % _ht.capacity();HashNode* cur = _ht[index];HashNode* prev = nullptr;while (cur){if (key == koft(cur->_data)){if (prev == nullptr) //cur就是头结点{_ht[index] = cur->_next;}else{prev->_next = cur->_next;}delete cur;--_size;return true;}prev = cur;cur = cur->_next;}return false;}private:vector<HashNode*> _ht;size_t _size;
};

2.unordered_map.h

#pragma once
#include"hash.h"namespace klaus
{template<class K,class V, class Hash = HashFunc<K>> //将hash接口开放,用户可自定义处理非string和int的映射方式class map{public:struct KOFT{const K& operator()(const pair<K,V>& data){return data.first;}};typedef HashTable<K, pair<K, V>, KOFT,Hash> HashTable;struct HashNode;typedef typename HashTable::iterator iterator;iterator begin(){return ht.begin();}iterator end(){return ht.end();}pair<iterator,bool> insert(const pair<K, V>& kv){return ht.insert(kv);}iterator find(const K& key){return ht.find(key);}bool erase(const K& key){return ht.erase(key);}V& operator[](const K& key){pair<iterator, bool> ret = ht.insert(make_pair(key, V()));return ret.first->second;}private:HashTable ht;};
}

3.unordered_set.h

#pragma once
#include"hash.h"
namespace klaus
{template<class K, class Hash = HashFunc<K>> //将hash接口开放,可以用户自己单独处理非string和int的映射class set{public:struct KOFT{const K& operator()(const K& key){return key;}};typedef typename HashTable<K,K,KOFT,Hash>::iterator iterator;iterator begin(){return ht.begin();}iterator end(){return ht.end();}pair<iterator, bool> insert(const K& key){return ht.insert(key);}iterator find(const K& key){return ht.find(key);}bool erase(const K& key){return ht.erase(key);}private:HashTable<K, K, KOFT, Hash> ht;};
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483935.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Transformer的编码器-解码器图像描述模型在AMD GPU上的应用

Transformer based Encoder-Decoder models for image-captioning on AMD GPUs — ROCm Blogs 图像描述&#xff0c;即基于生成式人工智能&#xff08;GenAI&#xff09;自动生成简洁的图像文本描述&#xff0c;在现实世界中有着非常重要的应用。例如&#xff0c;图像描述可以为…

Linux命令行解释器的模拟实现

欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;Linux命令行解释器 制作日期&#xff1a;2024.12.04 隶属专栏&#xff1a;linux之旅 本篇简介&#xff1a; 主线带你用ubuntu版系统步步分析实现基础版本的shell&#xff1b;比如支持重定向操作&#xff0…

Language Translation with TorchText

前言&#xff1a; 利用torchtext类来处理一个著名的数据集&#xff0c;包含了一些英文和德文句子。利用该数据处理sequence-to-sequence模型&#xff0c;通过注意力机制&#xff0c;可以将德语翻译成英语。Torchtext&#xff1a;它是 PyTorch 生态系统中的一个库&#xff0c;主…

【Redis篇】 List 列表

在 Redis 中&#xff0c;List 是一种非常常见的数据类型&#xff0c;用于表示一个有序的字符串集合。与传统的链表结构类似&#xff0c;Redis 的 List 支持在两端进行高效的插入和删除操作&#xff0c;因此非常适合实现队列&#xff08;Queue&#xff09;和栈&#xff08;Stack…

11.爬虫

前言&#xff1a; 正则表达式的作用&#xff1a; 作用一&#xff1a;校验字符串是否满足规则 作用二&#xff1a;在一段文本中查找满足要求的内容 一.Pattern类和Matcher类&#xff1a; 1.Pattern类&#xff1a;表示正则表达式 a.因此获取Pattern对象就相当于获取正则表达式…

【Linux篇】权限管理 - 用户与组权限详解

一. 什么是权限&#xff1f; 首先权限是限制人的。人 真实的人 身份角色 权限 角色 事物属性 二. 认识人–用户 Linux下的用户分为超级用户和普通用户 root :超级管理员&#xff0c;几乎不受权限的约束普通用户 :受权限的约束超级用户的命令提示符是#&#xff0c;普通用…

【RDMA】RDMA read和write编程实例(verbs API)

WRITE|READ编程&#xff08;RDMA read and write with IB verbs&#xff09; &#xff08;本文讲解的示例代码在&#xff1a;RDMA read and write with IB verbs | The Geek in the Corner&#xff09; 将 RDMA 与verbs一起使用非常简单&#xff1a;首先注册内存块&#xff0c…

UE5 C++ 不规则按钮识别,复选框不规则识别 UPIrregularWidgets

插件名称&#xff1a;UPIrregularWidgets 插件包含以下功能 你可以点击任何图片&#xff0c;而不仅限于矩形图片。 UPButton、UPCheckbox 基于原始的 Button、Checkbox 扩展。 复选框增加了不规则图像识别功能&#xff0c;复选框增加了悬停事件。 欢迎来到我的博客 记录学习过…

洛谷P2670扫雷游戏(Java)

三.P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中&#xff0c;外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂&#xff08;Customized Cheats&#xff09;&#xff0c;它不仅复杂且隐蔽&#xff0c;更能针对性地绕过传统的反作弊系统&#xff0c;对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

概率论相关知识随记

作为基础知识的补充&#xff0c;随学随记&#xff0c;方便以后查阅。 概率论相关知识随记 期望&#xff08;Expectation&#xff09;期望的定义离散型随机变量的期望示例&#xff1a;掷骰子的期望 连续型随机变量的期望示例&#xff1a;均匀分布的期望 期望的性质线性性质期望的…

DICOM MPPS详细介绍

文章目录 前言一、常规检查业务流程二、MPPS的作用三、MPPS的原理1、MPPS与MWL2、MPPS服务过程 四、MPPS的实现步骤1、创建实例2、传递状态 五、总结 前言 医院中现有的DICOM MWL(Modality Worklist)已开始逐渐得到应用&#xff0c;借助它可以实现病人信息的自动录入&#xff0…

Secured Finance 推出 TVL 激励计划以及基于 FIL 的稳定币

Secured Finance 是新一代 DeFi 2.0 协议&#xff0c;其正在推出基于 FIL 的稳定币、固定收益市场以及具有吸引力的 TVL 激励计划&#xff0c;以助力 Filecoin 构建更强大的去中心化金融生态体系&#xff0c;并为 2025 年初 Secured Finance 协议代币的推出铺平道路。Secure Fi…

FPGA Xilinx维特比译码器实现卷积码译码

FPGA Xilinx维特比译码器实现卷积码译码 文章目录 FPGA Xilinx维特比译码器实现卷积码译码1 Xilinx维特比译码器实现2 完整代码3 仿真结果 MATLAB &#xff08;n,k,m&#xff09;卷积码原理及仿真代码&#xff08;你值得拥有&#xff09;_matlab仿真后代码-CSDN博客 MATLAB 仿真…

Linux 权限管理:用户分类、权限解读与常见问题剖析

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 &#x1f4af;L…

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…

遗传算法与深度学习实战(26)——编码卷积神经网络架构

遗传算法与深度学习实战&#xff08;26&#xff09;——编码卷积神经网络架构 0. 前言1. EvoCNN 原理1.1 工作原理1.2 基因编码 2. 编码卷积神经网络架构小结系列链接 0. 前言 我们已经学习了如何构建卷积神经网络 (Convolutional Neural Network, CNN)&#xff0c;在本节中&a…

数学建模之熵权法

熵权法 概述 **熵权法(Entropy Weight Method,EWM)**是一种客观赋权的方法&#xff0c;原理&#xff1a;指标的变异程度越小&#xff0c;所包含的信息量也越小&#xff0c;其对应的权值应该越低&#xff08;例如&#xff0c;如果对于所有样本而言&#xff0c;某项指标的值都相…

同道猎聘Q3营收降利润增,AI或成估值重塑关键词

2024年&#xff0c;经济向好的趋势没有改变&#xff0c;挑战却仍然存在。企业纷纷进行结构性变革优化或业务方向调整。这一点反映到人才市场&#xff0c;绝大多数企业对招聘扩张持保守态度&#xff0c;降本增效的主题仍在延续。 作为人才市场水温变化的“温度计”&#xff0c;…

46 基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…