-
-
Save aozturk/2368896 to your computer and use it in GitHub Desktop.
| // Hash map class template | |
| template <typename K, typename V, typename F = KeyHash<K>> | |
| class HashMap { | |
| public: | |
| HashMap() { | |
| // construct zero initialized hash table of size | |
| table = new HashNode<K, V> *[TABLE_SIZE](); | |
| } | |
| ~HashMap() { | |
| // destroy all buckets one by one | |
| for (int i = 0; i < TABLE_SIZE; ++i) { | |
| HashNode<K, V> *entry = table[i]; | |
| while (entry != NULL) { | |
| HashNode<K, V> *prev = entry; | |
| entry = entry->getNext(); | |
| delete prev; | |
| } | |
| table[i] = NULL; | |
| } | |
| // destroy the hash table | |
| delete [] table; | |
| } | |
| bool get(const K &key, V &value) { | |
| unsigned long hashValue = hashFunc(key); | |
| HashNode<K, V> *entry = table[hashValue]; | |
| while (entry != NULL) { | |
| if (entry->getKey() == key) { | |
| value = entry->getValue(); | |
| return true; | |
| } | |
| entry = entry->getNext(); | |
| } | |
| return false; | |
| } | |
| void put(const K &key, const V &value) { | |
| unsigned long hashValue = hashFunc(key); | |
| HashNode<K, V> *prev = NULL; | |
| HashNode<K, V> *entry = table[hashValue]; | |
| while (entry != NULL && entry->getKey() != key) { | |
| prev = entry; | |
| entry = entry->getNext(); | |
| } | |
| if (entry == NULL) { | |
| entry = new HashNode<K, V>(key, value); | |
| if (prev == NULL) { | |
| // insert as first bucket | |
| table[hashValue] = entry; | |
| } else { | |
| prev->setNext(entry); | |
| } | |
| } else { | |
| // just update the value | |
| entry->setValue(value); | |
| } | |
| } | |
| void remove(const K &key) { | |
| unsigned long hashValue = hashFunc(key); | |
| HashNode<K, V> *prev = NULL; | |
| HashNode<K, V> *entry = table[hashValue]; | |
| while (entry != NULL && entry->getKey() != key) { | |
| prev = entry; | |
| entry = entry->getNext(); | |
| } | |
| if (entry == NULL) { | |
| // key not found | |
| return; | |
| } | |
| else { | |
| if (prev == NULL) { | |
| // remove first bucket of the list | |
| table[hashValue] = entry->getNext(); | |
| } else { | |
| prev->setNext(entry->getNext()); | |
| } | |
| delete entry; | |
| } | |
| } | |
| private: | |
| // hash table | |
| HashNode<K, V> **table; | |
| F hashFunc; | |
| }; |
Hi Hershal,
Brilliant catch :) Many thanks.
Hi aozturk,
I was wondering how do you implement hashFunc?
Especially how to handle different types from template.
Many thanks.
Hi, thanks for asking.
The full project is here: HashMap project
and the related blog post of mine is here: blog post
Hi aozturk,
Excellent post and example.
But I actually tried to make a hash_func with with my Class using this and boos unordered_map, and I've waste days.
I think will not be so difficult for you as it is for me. But I don´t know how to start. Thank you for help.
I know I need a hash_func but don´t know with ou without the Node, or just the bitset.
I need something like this:
- typedef std::unordered_map<bitset<300>, Node> myHashmap;
- typedef std::unordered_map<int, myHashmap > myHashMap;
My class Node is like this:
class Node
{
public:
Node() { id = 0;}
virtual ~Node() {}
int getId(){return id;}
void setId(int id){this->id = id;}
bool operator==(const Node& node) const
{
return (id == node.id);
}
Node& operator=(const Node& node)
{
id = node.id;
return *this;
}
Node operator=(const Node &n)
{
id = n.id;
}
protected:
private:
int id;
};
Hey aozturk,
Your page has moved to here: https://medium.com/@aozturk/simple-hash-map-hash-table-implementation-in-c-931965904250
Cheers,