今天面试的时候遇到面试官出了一个问题,要实现一个unordered_map. 我实现的不太好,所以面试之后重新自己整理实现了一个unordered_map,在此记录一下。

首先unordered_map的底层实现是哈希表。那么对于任何一个关键key的哈希,首先需要考虑的是哈希冲突的问题,在这里应该用链表的方式解决。如果不同的key哈希成了同一个地址,那么在链表的基础上向后连接就行。然后主要实现的是增删改查的功能,代码实现如下:

#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <functional>
using namespace std;//自定义的哈希函数类
class HashFunc{
public:int operator()(const int key){//对于int类型的key对应的hash函数,随便编的,不要在意这些细节return 3 * key + 1;}
};template <typename Key, typename Value>//这是链表节点,包括key和value
class HashNode{
public:Key key;Value value;HashNode *next;HashNode(Key _key, Value _value) :key(_key), value(_value), next(NULL){}~HashNode(){}
};template <typename Key, typename Value, typename HashFunc>
class HashMap{
public:int size;HashFunc hash;//hash是自定义的哈希函数,重载了类的()相当于重新定义了一个函数HashNode<Key, Value>**table;Value valuenull;HashMap(int _size);~HashMap();//插入操作bool insert(Key key, Value value);//删除操作bool del(Key &key);//查找,下面的[]运算符重载与之功能相同Value &find(Key &key);Value &operator[](Key &key);void print();//打印};template <typename Key, typename Value, typename HashFunc>
HashMap<Key, Value, HashFunc>::HashMap(int _size) :size(_size),hash(){//对table初始化table = new HashNode<Key, Value>*[_size];for (int i = 0; i < _size; i++){table[i] = NULL;}
}template<typename Key, typename Value, typename HashFunc>
HashMap<Key, Value, HashFunc>::~HashMap(){for (int i = 0; i < size; i++){HashNode<Key, Value>*cur = table[i];while (cur){HashNode<Key, Value>*temp = cur;cur = cur->next;delete temp;temp = NULL;}}delete table;
}template<typename Key, typename Value, typename HashFunc>
bool HashMap<Key, Value, HashFunc>::insert(Key key, Value value){//增加一个key-value对int index = hash(key) % size;//求出来对于每个key哈希到的地址索引HashNode<Key, Value> *hnode = new HashNode<Key, Value>(key, value);hnode->next = table[index];table[index] = hnode;return true;
}
template<typename Key, typename Value, typename HashFunc>
bool HashMap<Key, Value, HashFunc>::del(Key &key){//删除int index = hash(key) % size;HashNode<Key, Value> *cur = table[index];if (cur == NULL) return false;HashNode<Key, Value> *pre = cur;cur = cur->next;while (cur){if (cur->key == key){//找到匹配的键值对了pre->next = cur->next;delete cur;cur = NULL;return true;}else{cur = cur->next;pre = pre->next;}}return false;
}
template<typename Key, typename Value, typename HashFunc>
Value &HashMap<Key, Value, HashFunc>::find(Key &key){//查找int index = hash(key) % size;if (table[index] == NULL) return valuenull;HashNode<Key, Value>* cur = table[index];while (cur){if (cur->key == key) return cur->value;else cur = cur->next;}return valuenull;//没找到返回空
}template<typename Key, typename Value, typename HashFunc>
Value &HashMap<Key, Value, HashFunc>::operator[](Key &key){//重载[]通过索引来访问return find(key);
}template<typename Key, typename Value, typename HashFunc>//可以打印当前有多少key-value键值对
void HashMap<Key, Value, HashFunc>::print(){for (int i = 0; i < size; i++){HashNode<Key, Value> *cur = table[i];while (cur){cout << cur->value << " ";cur = cur->next;}cout << "NULL" << endl;}
}int main()
{HashMap<int, int, HashFunc> hashmap(10);hashmap.insert(1, 1);hashmap.insert(11, 5);hashmap.print();cout << "----------" << endl;hashmap.insert(2, 8);int num = 1;hashmap.del(num);//删除键值为1的hashmap.print();system("pause");return 0;
}

C++ 自己实现一个unordered_map(hashmap)相关推荐

  1. 如何动态的向数组中插入键值对_在Java中实现的一个简单“HashMap”

    如何创建Hash表 对于把K(键)-V(值)这样的键值对插入Hash表中,需要执行两个步骤: 1.使用散列函数将K转换为小整数(称为其哈希码). 2.哈希码用于查找索引(hashCode%arrSiz ...

  2. SoftReference(利用软引用写的一个简单HashMap)

    软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象.软引用对象最常用于实现内存敏感的缓存 软可到达对象的所有软引用都要保证在虚拟机抛出 OutOfMemoryError 之前已经被清除. 只 ...

  3. 【C++ 包装器类 map】C++ 标准库(std)中的map结构 哈希表(unordered_map)和黑红树(map)教程

    目录标题 1. 哈希表(unordered_map)和黑红树(map)简介以及初始化 1.1 哈希表的基本介绍 1.1.1 哈希表初始化接口示例 1.1.2 哈希表的键值的注意事项 1.1.3 自定义 ...

  4. 在js中使用HashMap数据结构,在js中使用K,V数据结构

    首先是定义一个HashMap方法,做基类(复制在js中即可,然后引用) //简单的哈希表,begin function HashMap() {/** Map 大小 * */var size = 0;/ ...

  5. 它又来了!C**HashMap是如何保证线程安全的?会用不就完了?

    欢迎关注方志朋的博客,回复"666"获面试宝典 阅读此篇文章,你需要有以下知识基础 Java内存模型,可见性问题 CAS HashMap底层原理 我们知道,在日常开发中使用的Has ...

  6. 有关 HashMap 面试会问的一切

    来自:码农田小齐 本文共6666字 | 阅读需12分钟 前言 HashMap 是无论在工作还是面试中都非常常见常考的数据结构. 比如 Leetcode 第一题 Two Sum 的某种变种的最优解就是需 ...

  7. HashMap 为什么会导致 CPU 100%?文章看不懂?

    来自:Java中文社群 无论是在实际工作中还是在面试中,HashMap 无疑是使用频率最高的知识点之一,所以我们需要搞懂每一个关于 HashMap 的知识点才行. 哈喽,大家好,我是老王,欢迎来到 J ...

  8. 如何使用意图将对象从一个Android活动发送到另一个?

    如何使用Intent类的putExtra()方法将自定义类型的对象从一个Activity传递到另一个Activity ? #1楼 感谢您的包裹帮助,但我发现了另一种可选解决方案 public clas ...

  9. hashmap允许null键和值吗_hashMap底层源码浅析

    来源:https://blog.csdn.net/qq_35824590/article/details/111769203 hashmap是我们经常使用的一个工具类.那么知道它的一些原理和特性吗? ...

最新文章

  1. Alibaba Sentinel限流功能
  2. Java 8 (8) 默认方法
  3. 浅析网站为什么长时间不收录?
  4. Java8之lambda表达式的总结
  5. jinjia2 模板不解析html
  6. 企业“数据压力锅”即将爆炸,CIO该如何防止爆锅?
  7. 计算机基础中的分层教学,分层教学法在计算机基础课程中的应用研究
  8. mysql2000数据库四合一_MSSQL2000四合一
  9. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
  10. Android动画类型
  11. java runtime ssh 后执行指令_酒后系列:被某厂面试官吊打后酒后整理的JVM干货
  12. 通过外挂插件向预训练语言模型中融入知识
  13. 精选 | 2018年5月R新包推荐
  14. 【数据预测】基于matlab BP+ELM+LSTM+BiLSTM+SAELSTM数据预测【含Matlab源码 1825期】
  15. SSM框架面试题总结
  16. 一元二次方程求根。当a=0时,输出“It is not a quadratic equation \n“;当a不等于0时,输出“一对共轭复根: “x1 = %.2f+%.2fi, x2 = %.2f
  17. mysql 主码和外码_sql如何用sql语句对一个已经编辑好的表在设置主码和外码?Atlassian Confluence安装以及咋更改数据库...
  18. 北斗导航 | RTKLib牛刀小试
  19. 智付科技集团2018全球合作伙伴大会成功举办 5大战略布局首度公开
  20. 学习完美方块小游戏(cocos creator)

热门文章

  1. python能做什么工作-学完Python我们可以做什么工作?
  2. python3入门代码-Python3入门(三)——Python基础语法
  3. python的第三方库是干什么用的-Python最强大的第三方库,你有必要了解一下!
  4. 零基础学python图文版-给伸手党的福利:Python 新手入门引导
  5. 普通人学python有什么用-学python日常工作有什么用?
  6. kite插件~快速提高代码速度
  7. mongooseDB数据库添加账号
  8. 蓝桥2017真题剪邮票
  9. 最简单的基于FFmpeg的移动端例子:Android 推流器
  10. C++调用CMD,等CMD运行完后继续运行C++