// // Created by Administrator on 2023/7/19. // #include #include template struct node_base { T data; node_base* last = nullptr; node_base* next = nullptr; }; template class List { public: explicit List(size_t l = 10) : node(new node_base()), last(node), len(l), size(0) { node_base* for_old = nullptr; node_base* current = last; for (int i = 0; i < len; ++i) { if (i != 0) current->last = for_old; current->next = new node_base(); for_old = current; current = current->next; } } void push_ele(T data) { if (last->next != nullptr) { last->data = data; last = last->next; } else { node_base* current = last; for (int i = 0; i < len * 2; ++i) { current->next = new node_base(); current->next->last = current; current = current->next; } len = len * 2; last->data = data; last = last->next; } ++size; } size_t find(T& data, std::function& fun) { node_base* header = node; for (int i = 0; i < size; ++i) { if (fun(&node->data) == fun(&data)) { node = header; return i; } node = node->next; if (node == nullptr) { node = header; return -1; } } return -1; } private: node_base* node; node_base* last; size_t len; size_t size; }; template struct pair { K first; V second; }; template class HashMap { public: HashMap() : size(100) { table = (List, K>**) malloc(sizeof( List, K>* ) * size); for (int i = 0; i < size; ++i) { table[i] = new List, K>(); } } virtual ~HashMap() { for (int i = 0; i < size; ++i) { delete table[i]; } delete table; } public: void insert(pair ele) { List, K>* list = table[buildHash(ele.first)]; list->push_ele(ele); } pair find(K key) { List, K>* list = table[buildHash(key)]; pair pa = {key, ""}; std::function*)> fun = [&] (pair* ele) { if (ele != &pa) { pa.second = ele->second; } return ele->first; }; list->find(pa, fun); return pa; } private: size_t buildHash(K key) { std::hash hash; return hash(key) % size; } private: size_t size; List, K>** table; }; int main () { HashMap hashMap; hashMap.insert({"one", "exe haha"}); auto item = hashMap.find("one"); printf("%s", item.second.c_str()); }