Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <iostream>
- #include <exception>
- #include <stdexcept>
- #include <assert.h>
- #define SIZE 10
- class HashEntry {
- public:
- int _k;
- int _v;
- HashEntry(int k, int v) : _k(k), _v(v) {};
- };
- class HashMap {
- private:
- std::vector<HashEntry> buckets[SIZE];
- int hashFunc(int key);
- std::vector<HashEntry>& getBucket(int key);
- public:
- bool keyExists(int k);
- HashEntry get(int k);
- bool put(int k, int v);
- bool remove(int k);
- };
- int HashMap::hashFunc(int key) {
- return key % SIZE;
- }
- std::vector<HashEntry>& HashMap::getBucket(int key) {
- if (key < 0) {
- throw std::runtime_error("key should be >= 0");
- }
- return buckets[hashFunc(key)];
- }
- HashEntry HashMap::get(int k) {
- std::vector<HashEntry>& bucket = getBucket(k);
- for (HashEntry entry : bucket) {
- if (entry._k == k) {
- return entry;
- }
- }
- throw std::runtime_error("Key not found");
- }
- bool HashMap::keyExists(int k) {
- std::vector<HashEntry>& bucket = getBucket(k);
- for (HashEntry entry : bucket) {
- if (entry._k == k) {
- // key already exists
- return true;
- }
- }
- return false;
- }
- bool HashMap::put(int k, int v) {
- std::vector<HashEntry>& bucket = getBucket(k);
- if (keyExists(k)) return false;
- bucket.push_back(HashEntry(k, v));
- return true;
- }
- bool HashMap::remove(int k) {
- std::vector<HashEntry>& bucket = getBucket(k);
- if (!(keyExists(k))) return false;
- for (auto itr = bucket.begin(); itr != bucket.end(); ++itr) {
- HashEntry entry = static_cast<HashEntry>(*itr);
- if (entry._k == k) {
- bucket.erase(itr);
- return true;
- break;
- }
- }
- return false;
- }
- int main() {
- HashMap map;
- for (int i=0; i < 10; ++i) {
- assert(map.put(i, i*10));
- }
- for (int i=0; i < 10; ++i) {
- assert(map.keyExists(i) == true);
- }
- assert(map.keyExists(0) == true);
- assert(map.get(0)._v == 0);
- assert(map.remove(0) == true);
- assert(map.remove(0) == false);
- assert(map.keyExists(0) == false);
- bool exceptionThrown = false;
- try {
- map.get(0);
- } catch (std::exception &e) {
- exceptionThrown = true;
- };
- assert(exceptionThrown);
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement