今天面试的时候遇到面试官出了一个问题,要实现一个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是自定义的哈希函