/** * File: array_hash_map.cpp * Created Time: 2022-12-14 * Author: msk397 (machangxinq@gmail.com) */ #include "../utils/common.hpp" /* 키-값 쌍 */ struct Pair { public: int key; string val; Pair(int key, string val) { this->key = key; this->val = val; } }; /* 배열로 구현한 해시 테이블 */ class ArrayHashMap { private: vector buckets; public: ArrayHashMap() { // 버킷 100개를 포함하는 배열을 초기화한다 buckets = vector(100); } ~ArrayHashMap() { // 메모리 해제 for (const auto &bucket : buckets) { delete bucket; } buckets.clear(); } /* 해시 함수 */ int hashFunc(int key) { int index = key % 100; return index; } /* 조회 연산 */ string get(int key) { int index = hashFunc(key); Pair *pair = buckets[index]; if (pair == nullptr) return ""; return pair->val; } /* 추가 연산 */ void put(int key, string val) { Pair *pair = new Pair(key, val); int index = hashFunc(key); buckets[index] = pair; } /* 삭제 연산 */ void remove(int key) { int index = hashFunc(key); // 메모리를 해제하고 nullptr로 설정한다 delete buckets[index]; buckets[index] = nullptr; } /* 모든 키-값 쌍 반환 */ vector pairSet() { vector pairSet; for (Pair *pair : buckets) { if (pair != nullptr) { pairSet.push_back(pair); } } return pairSet; } /* 모든 키 반환 */ vector keySet() { vector keySet; for (Pair *pair : buckets) { if (pair != nullptr) { keySet.push_back(pair->key); } } return keySet; } /* 모든 값 반환 */ vector valueSet() { vector valueSet; for (Pair *pair : buckets) { if (pair != nullptr) { valueSet.push_back(pair->val); } } return valueSet; } /* 해시 테이블 출력 */ void print() { for (Pair *kv : pairSet()) { cout << kv->key << " -> " << kv->val << endl; } } }; // 테스트 예제는 array_hash_map_test.cpp를 참고한다