当前位置:   article > 正文

C++ 自己实现一个unordered_map(hashmap)_c++ unordered_map实现

c++ unordered_map实现

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

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

  1. #include <iostream>
  2. #include <string>
  3. #include <queue>
  4. #include <vector>
  5. #include <map>
  6. #include <unordered_map>
  7. #include <set>
  8. #include <unordered_set>
  9. #include <functional>
  10. using namespace std;
  11. //自定义的哈希函数类
  12. class HashFunc{
  13. public:
  14. int operator()(const int key){//对于int类型的key对应的hash函数,随便编的,不要在意这些细节
  15. return 3 * key + 1;
  16. }
  17. };
  18. template <typename Key, typename Value>//这是链表节点,包括key和value
  19. class HashNode{
  20. public:
  21. Key key;
  22. Value value;
  23. HashNode *next;
  24. HashNode(Key _key, Value _value) :key(_key), value(_value), next(NULL){}
  25. ~HashNode(){}
  26. };
  27. template <typename Key, typename Value, typename HashFunc>
  28. class HashMap{
  29. public:
  30. int size;
  31. HashFunc hash;//hash是自定义的哈希函数,重载了类的()相当于重新定义了一个函数
  32. HashNode<Key, Value>**table;
  33. Value valuenull;
  34. HashMap(int _size);
  35. ~HashMap();
  36. //插入操作
  37. bool insert(Key key, Value value);
  38. //删除操作
  39. bool del(Key &key);
  40. //查找,下面的[]运算符重载与之功能相同
  41. Value &find(Key &key);
  42. Value &operator[](Key &key);
  43. void print();//打印
  44. };
  45. template <typename Key, typename Value, typename HashFunc>
  46. HashMap<Key, Value, HashFunc>::HashMap(int _size) :size(_size),hash(){
  47. //对table初始化
  48. table = new HashNode<Key, Value>*[_size];
  49. for (int i = 0; i < _size; i++){
  50. table[i] = NULL;
  51. }
  52. }
  53. template<typename Key, typename Value, typename HashFunc>
  54. HashMap<Key, Value, HashFunc>::~HashMap(){
  55. for (int i = 0; i < size; i++){
  56. HashNode<Key, Value>*cur = table[i];
  57. while (cur){
  58. HashNode<Key, Value>*temp = cur;
  59. cur = cur->next;
  60. delete temp;
  61. temp = NULL;
  62. }
  63. }
  64. delete table;
  65. }
  66. template<typename Key, typename Value, typename HashFunc>
  67. bool HashMap<Key, Value, HashFunc>::insert(Key key, Value value){//增加一个key-value对
  68. int index = hash(key) % size;//求出来对于每个key哈希到的地址索引
  69. HashNode<Key, Value> *hnode = new HashNode<Key, Value>(key, value);
  70. hnode->next = table[index];
  71. table[index] = hnode;
  72. return true;
  73. }
  74. template<typename Key, typename Value, typename HashFunc>
  75. bool HashMap<Key, Value, HashFunc>::del(Key &key){//删除
  76. int index = hash(key) % size;
  77. HashNode<Key, Value> *cur = table[index];
  78. if (cur == NULL) return false;
  79. HashNode<Key, Value> *pre = cur;
  80. cur = cur->next;
  81. while (cur){
  82. if (cur->key == key){//找到匹配的键值对了
  83. pre->next = cur->next;
  84. delete cur;
  85. cur = NULL;
  86. return true;
  87. }
  88. else{
  89. cur = cur->next;
  90. pre = pre->next;
  91. }
  92. }
  93. return false;
  94. }
  95. template<typename Key, typename Value, typename HashFunc>
  96. Value &HashMap<Key, Value, HashFunc>::find(Key &key){//查找
  97. int index = hash(key) % size;
  98. if (table[index] == NULL) return valuenull;
  99. HashNode<Key, Value>* cur = table[index];
  100. while (cur){
  101. if (cur->key == key) return cur->value;
  102. else cur = cur->next;
  103. }
  104. return valuenull;//没找到返回空
  105. }
  106. template<typename Key, typename Value, typename HashFunc>
  107. Value &HashMap<Key, Value, HashFunc>::operator[](Key &key){//重载[]通过索引来访问
  108. return find(key);
  109. }
  110. template<typename Key, typename Value, typename HashFunc>//可以打印当前有多少key-value键值对
  111. void HashMap<Key, Value, HashFunc>::print(){
  112. for (int i = 0; i < size; i++){
  113. HashNode<Key, Value> *cur = table[i];
  114. while (cur){
  115. cout << cur->value << " ";
  116. cur = cur->next;
  117. }
  118. cout << "NULL" << endl;
  119. }
  120. }
  121. int main()
  122. {
  123. HashMap<int, int, HashFunc> hashmap(10);
  124. hashmap.insert(1, 1);
  125. hashmap.insert(11, 5);
  126. hashmap.print();
  127. cout << "----------" << endl;
  128. hashmap.insert(2, 8);
  129. int num = 1;
  130. hashmap.del(num);//删除键值为1的
  131. hashmap.print();
  132. system("pause");
  133. return 0;
  134. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/452286
推荐阅读
相关标签
  

闽ICP备14008679号