📖 Scenario: Imagine you want to build a simple phone book app that stores names and phone numbers. To do this efficiently, you decide to create your own HashMap from scratch in C++. This will help you understand how data is stored and retrieved quickly.
🎯 Goal: You will build a basic HashMap class in C++ that can store key-value pairs (names and phone numbers), handle collisions using chaining, and allow adding and retrieving entries.
📋 What You'll Learn
Create a HashMap class with an array of buckets
Use linked lists to handle collisions in each bucket
Implement a hash function to map keys to bucket indices
Add methods to insert key-value pairs and retrieve values by key
Print the contents of the HashMap to verify correct storage
💡 Why This Matters
🌍 Real World
HashMaps are used in many applications like phone books, caches, and databases to store and retrieve data quickly.
💼 Career
Understanding how HashMaps work under the hood is important for software engineers, especially when optimizing data storage and retrieval.
Progress0 / 4 steps
1
Create the basic HashMap structure
Create a class called HashMap with a private array of 5 buckets called buckets. Each bucket should be a pointer to a linked list node struct called Node. Define the Node struct with key (string), value (string), and next (Node pointer). Initialize all buckets to nullptr in the HashMap constructor.
DSA C++
Hint
Start by defining the Node struct with the required fields. Then create the HashMap class with an array of 5 Node* pointers. Initialize each bucket to nullptr in the constructor.
2
Add a simple hash function
Inside the HashMap class, add a private method called hashFunction that takes a const std::string& key and returns an int. This function should compute the sum of ASCII values of all characters in key and return the sum modulo 5.
DSA C++
Hint
Loop over each character in the key, add its ASCII value to a sum, then return sum modulo 5.
3
Implement insert method with chaining
Add a public method void insert(const std::string& key, const std::string& value) to the HashMap class. Use hashFunction to find the bucket index. Insert a new Node with the given key and value at the start of the linked list in that bucket (handle collisions by chaining).
DSA C++
Hint
Create a new node and insert it at the front of the linked list in the bucket found by the hash function.
4
Print all key-value pairs in the HashMap
Add a public method void printAll() to the HashMap class. This method should iterate over all buckets and print each key-value pair in the format key: value. Then, in main(), create a HashMap object, insert these entries: ("Alice", "1234"), ("Bob", "5678"), ("Charlie", "91011"), and call printAll().
DSA C++
Hint
Loop through each bucket and then through each linked list node to print all key-value pairs. In main(), insert the given entries and call printAll().
Practice
(1/5)
1. What is the main purpose of a HashMap in data structures?
easy
A. To store elements in sorted order
B. To store key-value pairs for fast data retrieval
C. To perform mathematical calculations
D. To store data sequentially like an array
Solution
Step 1: Understand the role of HashMap
A HashMap stores data as key-value pairs allowing quick access by key.
Step 2: Compare with other data structures
Unlike arrays or lists, HashMaps do not store data sequentially or sorted but focus on fast lookup.
Final Answer:
To store key-value pairs for fast data retrieval -> Option B
Quick Check:
HashMap = key-value fast access [OK]
Hint: HashMap = key-value pairs for quick lookup [OK]
Common Mistakes:
Confusing HashMap with sorted structures
Thinking HashMap stores data sequentially
Assuming HashMap is for calculations
2. Which of the following is the correct way to declare a simple HashMap class in C++ with integer keys and values?
easy
A. class HashMap { int map[10]; };
B. class HashMap { std::map map; };
C. class HashMap { std::vector<int> map; };
D. class HashMap { std::unordered_map map; };
Solution
Step 1: Identify correct HashMap container
In C++, std::unordered_map is the standard hash map container for key-value pairs.
Step 2: Check other options
std::map is ordered map, std::vector is a dynamic array, and raw array is fixed size, so only unordered_map fits HashMap concept.
Final Answer:
class HashMap { std::unordered_map<int, int> map; }; -> Option D
Quick Check:
unordered_map = HashMap container [OK]
Hint: Use std::unordered_map for hash map in C++ [OK]
Common Mistakes:
Using std::map which is ordered, not hash-based
Using vector which is not key-value
Using fixed size array for dynamic keys
3. Consider this simplified HashMap insert function snippet in C++:
Step 1: Calculate bucket indices and insert/update
For key=2, index=2%5=2, bucket empty, insert {2,10}. For key=7, index=7%5=2, bucket occupied, update value to 20. For key=2 again, index=2, update value to 30. For key=12, index=12%5=2, bucket occupied, update value to 40.
Step 2: Trace carefully each step
All keys map to index 2, so bucket 2 ends with last update {2,40}. Other buckets remain empty.
Keys 2,7,12 map to indices 2, 2, 2? Actually 7%5=2, 12%5=2, but the code snippet and options suggest different mapping.
Hint: Check key % bucket_size and update existing bucket [OK]
Common Mistakes:
Assuming keys go to different buckets
Not updating value on collision
Miscalculating modulo index
4. Given this buggy insert function for a HashMap:
void insert(int key, int value) {
int index = key % size;
if (buckets[index].first == -1) {
buckets[index] = {key, value};
} else {
buckets[index] = {key, value};
}
}
What is the main problem with this code?
medium
A. It uses an uninitialized buckets array
B. It does not calculate the index correctly
C. It overwrites existing keys without checking for duplicates
D. It does not handle negative keys
Solution
Step 1: Analyze insert logic
The code checks if bucket is empty, inserts key-value. Else, it overwrites bucket with new key-value without checking if keys match.
Step 2: Identify missing duplicate key check
Without checking if existing key equals new key, it overwrites any existing entry causing data loss on collisions.
Final Answer:
It overwrites existing keys without checking for duplicates -> Option C
Quick Check:
Overwrite without key check = bug [OK]
Hint: Always check existing key before overwrite [OK]
Common Mistakes:
Ignoring key equality on collision
Assuming index calculation is wrong
Missing buckets initialization
5. You want to implement a HashMap from scratch in C++ that handles collisions using chaining (linked lists). Which of the following describes the best approach?
hard
A. Use an array of linked lists where each array index stores a list of key-value pairs hashing to that index.
B. Use a single linked list to store all key-value pairs regardless of hash.
C. Use a balanced binary search tree instead of an array.
D. Use a fixed-size array and overwrite values on collision.
Solution
Step 1: Understand collision handling by chaining
Chaining uses an array where each slot holds a linked list of all key-value pairs that hash to that index.
Step 2: Evaluate options
Use an array of linked lists where each array index stores a list of key-value pairs hashing to that index. correctly describes chaining. Use a single linked list to store all key-value pairs regardless of hash. uses one list for all keys, losing hash benefits. Use a balanced binary search tree instead of an array. is a different data structure. Use a fixed-size array and overwrite values on collision. overwrites on collision, losing data.
Final Answer:
Use an array of linked lists where each array index stores a list of key-value pairs hashing to that index. -> Option A
Quick Check:
Chaining = array of linked lists [OK]
Hint: Chaining = array with linked lists per bucket [OK]
Common Mistakes:
Using single list for all keys
Overwriting on collision
Confusing chaining with open addressing
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.