用C++实现一个哈希桶(插入,删除,寻找)
来源:互联网 发布:windows安装器安装win7 编辑:程序博客网 时间:2024/06/05 18:56
#include<iostream>#include<vector>#include<string>using namespace std;struct DefaultHashFuncString //构造仿函数{size_t operator()(const string & key){size_t ret = 0;for (size_t i = 0; i < key.size(); i++){ret += key[i];}return ret;}};template<class K>struct DefaultHashFunc //构造仿函数{size_t operator()(const K & key){return key;}};template<class K,class V>struct HashTableNode //结点结构体{K _key;V _value;HashTableNode *_next;};template<class K, class V, class HashFunc = DefaultHashFunc<K>>class HashTable{typedef HashTableNode<K,V> Node;public:HashTable(size_t size = 10):_size(0){_table.resize(size);}~HashTable(){for (size_t i = 0; i < _table.size(); i++){Node *cur = _table[i];while (cur){Node* tmp = cur;cur = cur->_next;delete tmp;}}_size = 0;}public:void Insert(const K &key,const V& value) //插入{_CheckCapacity();size_t index = HashFun(key);Node *cur = _table[index];if (cur){while (cur->_next){cur = cur->_next;}cur->_next = new Node;cur = cur->_next;cur->_key = key;cur->_value = value;cur->_next = NULL;}else{_table[index] = new Node;_table[index]->_key = key;_table[index]->_value = value;_table[index]->_next = NULL;}++_size;}Node * Find(const K& key) //寻找{size_t index = HashFun(key);Node *cur = _table[index];while (cur){if (cur->_key == key){return cur;}cur = cur->_next;}return NULL;}bool Remove(const K& key) //删除{size_t index = HashFun(key);Node *cur = _table[index];if (!cur){return false;}else if (cur->_next == NULL){delete cur;_table[i] = NULL;return true;}else{Node * prev = cur;cur = cur->_next;while (cur){if (cur->_key == key){Node tmp = cur;cur = cur->_next;prev->next = tmp->_next;return true;}}}}void Printf(){for (size_t i = 0; i < _table.size(); i++){printf("_table[%d]:", i);Node *cur = _table[i];while (cur){cout << cur->_key << "->";cur = cur->_next;}cout << "NULL"<<endl;}}protected:size_t HashFun(const K & key) //计算index{return HashFunc()(key) % _table.size();}void _CheckCapacity() //容量检查<span style="font-family: Arial, Helvetica, sans-serif;">(负载因子)</span>{if (_size >= _table.size()){size_t size = 2 * _size;HashTable<K,V>tmp;/* = new Node[size];*/tmp._table.resize(size);for (size_t i = 0; i < _table.size(); i++){Node *cur = _table[i];while (cur){tmp.Insert(cur->_key,cur->_value);cur = cur->_next;}}_table.swap(tmp._table);}}protected:vector<Node*> _table;size_t _size;};
0 0
- 用C++实现一个哈希桶(插入,删除,寻找)
- 用C++实现一个哈希表(插入,删除,查找)
- 用c实现HASH表创建、插入、查找、删除、打印
- 用c实现HASH表创建、插入、查找、删除、打印
- 数据结构 单链表插入删除操作(c语言实现)
- 平衡二叉树(遍历,插入,删除)的C实现
- 用c实现HASH表创建、插入、查找、删除、打印(欢迎高手指点)
- 用c实现HASH表创建、插入、查找、删除、打印(欢迎高手指点)【转】
- C/C++,数据结构单链表(采用C++"引用"方法)(寻找节点、在某处插入结点、删除某位置结点)
- 链表的插入,删除,寻找
- 用c语言实现 一个通讯录(实现 增加、删除、查找、修改、显示、清空功能)
- 用c语言完成一个双向链表的创建,插入,删除
- 用JAVA语言,编写一个链表类(双向链表),实现插入,删除,查找操作
- 一个用Java实现的双向队列,可以分别在头尾插入和删除节点
- 实现一个单链表的建立、测长、打印、删除、插入
- 平衡二叉树(可重复key)插入删除(c/c++实现)
- C语言实现二叉查找树(搜索树)的创建,插入,查找,删除
- C语言实现双链表基本操作(创建、查找、插入、删除)
- SDAU练习三1018
- node.js实现微博系统在express3.0+版本下的实现——所遇问题
- 剑指offer经典题(利用C++的特性)
- n^n的末位数字(快速幂)
- 安卓加载图片过大而导致OOM内存溢出的解决方法(巨坑....)
- 用C++实现一个哈希桶(插入,删除,寻找)
- 毕设系列—客户端:Vitamio框架开发(1)初次安装及配置
- ubuntu登录界面循环
- 局域网中抓到NBNS数据包
- android activity 属性记录
- ZOJ 3819Average Score
- 安卓手机摄像头变身网络摄像头IP webcame pro V1.10
- 赫夫曼树
- 第6次c++作业