4. Example: Full Manual Implementation
This chapter combines all the concepts from Chapters 2 and 3 into a single, complete MyHashMap class. This class handles insertion, searching, deletion, and automatic rehashing.
#include <iostream>
#include <string>
#include <vector>
#include <list>
// Data Node: Struct to store Key-Value pairs
struct KeyValuePair {
std::string key;
int value;
KeyValuePair(std::string k, int v) : key(k), value(v) {}
};
class MyHashMap {
private:
int n; // Number of items
int m; // Number of buckets (table size)
std::vector<std::list<KeyValuePair>> table;
const float MAX_LOAD_FACTOR = 0.75;
// Hash Function (Simple Division Method)
int hashFunction(std::string key) {
int hash = 0;
// A simple hash: sum ASCII values
for (char c : key) {
hash = (hash + (int)c);
}
return hash % m; // Use current table size 'm'
}
// Rehashing Function
void rehash() {
// Get old table and size
std::vector<std::list<KeyValuePair>> oldTable = table;
int oldSize = m;
// Allocate new, larger table
m = m * 2;
table.clear();
table.resize(m);
n = 0; // Reset item count
std::cout << ". New size: " << m << std::endl;
// Re-insert all elements from old table
for (int i = 0; i < oldSize; ++i) {
for (auto& pair : oldTable[i]) {
// Re-hash and insert into new table
insert(pair.key, pair.value);
}
}
}
public:
// Constructor: Initialize table
MyHashMap(int size = 10) { // Default size of 10
n = 0;
m = size;
table.resize(m);
}
// Insert Function (with rehashing)
void insert(std::string key, int value) {
// Check load factor before inserting
if ((float)(n + 1) / m > MAX_LOAD_FACTOR) {
rehash();
}
// Hash the key (uses the new 'm' if rehashed)
int index = hashFunction(key);
// Traverse chain to find or update
for (auto& pair : table[index]) {
if (pair.key == key) {
pair.value = value;
return;
}
}
// Not found, add new pair and increment item count
table[index].push_back(KeyValuePair(key, value));
n++;
}
// Search Function
int search(std::string key) {
int index = hashFunction(key);
for (auto& pair : table[index]) {
if (pair.key == key) {
return pair.value;
}
}
return -1; // Not found
}
// Remove Function
void remove(std::string key) {
int index = hashFunction(key);
auto& chain = table[index];
for (auto it = chain.begin(); it != chain.end(); ++it) {
if (it->key == key) {
chain.erase(it); // Remove element at position 'it'
n--; // Decrement item count
return;
}
}
}
};