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) ...
随机推荐
- 获取枚举类型Description特性的描述信息
C#中可以对枚举类型用Description特性描述. 如果需要对Description信息获取,那么可以定义一个扩展方法来实现.代码如下: public static class EnumExten ...
- ASP.NET RepeatLayout 属性
定义和用法 RepeatLayout 属性用于设置或获取如何显示在 CheckBoxList 中的项目. 语法 <asp:CheckBoxList RepeatLayout="mode ...
- ps插件安装
CutAndSliceMe.zxp 切图插件安装,下载后改为zip后缀,再解压后 复制文件夹到(PS软件安装目录)PhotoshopCC\Plug-ins\Panels文件夹下面
- C# - DataValid数据验证类
从EasyCode 摘取下来的数据验证类 using System; using System.Collections.Generic; using System.Text; namespace Le ...
- Html - Bootstrap 头部
<div class="container"> <div class="row clearfix"> <div class=&qu ...
- HTML第一课总结
1.图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果. 示例: 2.网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容. 示例: 3.网页的拼接: ...
- redis 配置 linux
附件 启动停止脚本 redis_6433: #/bin/sh #Configurations injected by install_server below.... EXEC=/usr/local/ ...
- git基础及分支
关于版本控制 git是一种分布版本控制系统,每一主机都保存了完整副本.必杀技是分支. 在Windows可安装git客户端msysgit. git基础 第一次看progit觉得有点不懂,不懂版本控制,一 ...
- ThinkPHP中的三大自动简介
ThinkPHP中的三大自动简介 文章TAG:thinkphp 自动简介 时间:2014-08-23来源:商业源码网 作者:源码库 文章热度: 186 ℃ 过期已备案域名,注册就能用!终身VIP会员, ...
- 如何查询MySql日志
如何查询MySql日志 分类: mysql2012-02-23 19:14 26756人阅读 评论(2) 收藏 举报 mysqlcommandprintingserversocketoutput 今天 ...