C++ 简单 Hash容器的实现
- #ifndef _MY_HASH_INT_H_
- #define _MY_HASH_INT_H_
- template<class T,class K>
- class HashInt{
- public:
- HashInt();
- virtual ~HashInt();
- private:
- typedef struct tagElement
- {
- T data;
- K key;
- bool use;
- tagElement(){use = false;}
- ~tagElement(){}
- }Element;
- unsigned int m_nSize;
- Element *m_arrT;
- unsigned int m_nElementCnt;
- // 查找
- bool find(K key,unsigned int &index);
- public:
- // 初始化,分配内存
- bool init(const unsigned int size);
- // 哈希函数
- unsigned int hash(K key);
- // ELF哈希函数
- unsigned int hash_elf(char *str);
- // 插入
- bool insert(T data,K key);
- // 删除
- bool remove(K key);
- // 查找
- bool find(K key,T &data);
- // 修改
- bool modify(T data,K key);
- void dump();
- };
- template<class T,class K>
- unsigned int HashInt<T, K>::hash_elf( char *str)
- {
- unsigned int locate = ;
- unsigned int x = ;
- while (*str)
- {
- locate = (locate << ) + (*str++);//hash左移4位,当前字符ASCII存入hash低四位。
- if ((x = locate & 0xF0000000L) != )
- {//如果最高的四位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出,因此要有如下处理。
- locate ^= (x >> );
- //清空28-31位。
- locate &= ~x;
- }
- }
- return locate%m_nSize;
- }
- template<class T,class K>
- HashInt<T, K>::~HashInt()
- {
- if(m_arrT != NULL)
- {
- delete[] m_arrT;
- }
- }
- template<class T,class K>
- HashInt<T, K>::HashInt()
- {
- m_arrT = NULL;
- m_nSize = ;
- m_nElementCnt = ;
- }
- template<class T,class K>
- void HashInt<T, K>::dump()
- {
- cout<<"m_nElementCnt="<<m_nElementCnt<<",m_nSize="<<m_nSize<<endl;
- for(unsigned int i = ;i < m_nSize;i++)
- {
- if(m_arrT[i].use == true)
- {
- cout<<i<<"-";
- m_arrT[i].data->display();
- }
- }
- cout<<endl;
- }
- template<class T,class K>
- bool HashInt<T, K>::modify( T data,K key )
- {
- if( m_nElementCnt == )
- {
- return false;
- }
- bool exist = false;
- unsigned int index;
- exist = find(key,index);
- if( exist == true )
- {
- m_arrT[index].data = data;
- }
- return false;
- }
- template<class T,class K>
- bool HashInt<T, K>::find( K key,T &data )
- {
- if( m_nElementCnt == )
- {
- return false;
- }
- bool exist = false;
- unsigned int index;
- exist = find(key,index);
- if( exist == true )
- {
- data = m_arrT[index].data;
- }
- return false;
- }
- template<class T,class K>
- bool HashInt<T, K>::find( K key,unsigned int &index )
- {
- if( m_nElementCnt == )
- {
- return false;
- }
- unsigned int locate = hash(key),i = ;
- while(i < m_nSize)
- {
- if( m_arrT[locate].use == true && m_arrT[locate].key == key)
- {
- index = locate;
- return true;
- }
- locate = (locate + i)%m_nSize;
- i++;
- }
- return false;
- }
- template<class T,class K>
- bool HashInt<T, K>::remove( K key )
- {
- // 表为空
- if( m_nElementCnt == )
- {
- return false;
- }
- bool exist = false;
- unsigned int index;
- exist = find(key,index);
- if( exist == true )
- {
- m_arrT[index].use = false;
- m_nElementCnt--;
- return true;
- }
- return false;
- }
- template<class T,class K>
- bool HashInt<T, K>::insert( T data,K key)
- {
- // 表已满
- if( m_nElementCnt == m_nSize )
- {
- return false;
- }
- unsigned int locate = hash(key),i = ;
- while(i < m_nSize)
- {
- if( m_arrT[locate].use == false)
- {
- m_arrT[locate].data = data;
- m_arrT[locate].key = key;
- m_arrT[locate].use = true;
- m_nElementCnt++;
- return true;
- }
- locate = (locate + i)%m_nSize;
- i++;
- }
- return false;
- }
- template<class T,class K>
- unsigned int HashInt<T, K>::hash( K key )
- {
- return key%m_nSize;
- }
- template<class T,class K>
- bool HashInt<T, K>::init( const unsigned int size )
- {
- m_nSize = size;
- m_arrT = new Element[m_nSize];
- m_nElementCnt = ;
- cout<<"size = "<<sizeof(Element)*m_nSize<<endl;
- return true;
- }
- #endif
C++ 简单 Hash容器的实现的更多相关文章
- 理解与模拟一个简单servlet容器
servlet接口 使用servlet编程需要实现或者继承实现了javax.servlet.Servlet接口的类,其中定义了5个签名方法: public void init(ServletConfi ...
- HDOJ-ACM1425 sort 简单hash应用
其实快排也可以通过这个问题~不是考点 没想到考点是这个,简单hash应用,空间换时间 初始化一个长度为1000001的数组(由于数字的范围为[-500000,500000]) 如果存在这个数m,数组下 ...
- 一个简单servlet容器
一个简单servlet容器 2.1 javax.servlet.Servlet接口 Servlet编程需要使用javax.servlet和javax.servlet.http两个包下的接口和类 在所有 ...
- 【最简单IOC容器实现】实现一个最简单的IOC容器
前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...
- HDU 1880 简单Hash
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=1880] 中文题面,题意很简单: 题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到ma ...
- HDU——2112HDU Today(SPFA+简单Hash或map+前向星)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 简单IOC容器实现
前言 本文是为了学习Spring IOC容器的执行过程而写,不能完全代表Spring IOC容器,只是简单实现了容器的依赖注入和控制反转功能,无法用于生产,只能说对理解Spring容器能够起到一定的作 ...
- 简单Hash函数LongHash
import java.security.SecureRandom; import java.util.Random; public class LongHash { private static l ...
- hdu 4287Intelligent IME(简单hash)
Intelligent IME Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- BeagleBone硬件概览Ethernet端口板载LEDc重置按钮等介绍
BeagleBone硬件概览Ethernet端口板载LEDc重置按钮等介绍 你进入BeagleBone世界的第一步就是将它连接以得到命令提示,然后你就可以处理文件以及执行命令了.在这里,你就可以定制你 ...
- Hadoop_10_shuffle02_详解Shuffle过程【来源网络】推荐更为详细
网址:http://www.cnblogs.com/felixzh/p/4680808.html Shuffle过程,也称Copy阶段.reduce task从各个map task上远程拷贝一片数据, ...
- DataTable转换成List<T>
很多时候需要将DataTable转换成一组model,直接对model执行操作会更加方便直观. 代码如下: public static class DataTableToModel { public ...
- BZOJ3790 : 神奇项链
Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ...
- chrome developer tool 调试技巧
这篇文章是根据目前 chrome 稳定版(19.0.1084.52 m)写的, 因为 google 也在不断完善chrome developer tool, 所以 chrome 版本不同可能稍有差别. ...
- javascript,HTML,PHP,ASP做301跳转代码 SEO优化设置
URL HTTP Redirection URL http redirection is an automatic URL change operation from one URL to anoth ...
- NOIp 2006 作业调度方案 Label:坑 模拟(tyvj你不给我ac,我就把名字献给附中oj)
福建师大附中链接:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1211 [问题描述] 我们现在要利用m台机器加工n个工件,每个工件都有m道工序 ...
- COJ976 WZJ的数据结构(负二十四)
试题描述 输入一个字符串S,回答Q次问题,给你l,r,输出从Sl--Sr组成的串在S中出现了多少次. 输入 第一行为一个字符串S.第二行为一个正整数Q.接下来Q行每行为l,r. 输出 对于每个询问,输 ...
- [开源框架推荐]Icepdf:纯java的pdf文档的提取和转换库
ICEpdf 是一个轻量级的开源 Java 语言的 PDF 类库.通过 ICEpdf 可以用来浏览.内容提取和转换 PDF 文档,而无须一些本地PDF库的支持. 可以用来做什么? 1.从pdf文件中提 ...
- Struts2之自定义类型转换器
Struts2自定义类型转换器分为局部类型转换器和全局类型转换器 (1)局部类型转换器 如果页面传来一个参数reg.action?birthday=2010-11-12到后台action,然后属性用d ...