简易的hashtable实现

参考他人思路而写,具体可参考:http://blog.csdn.net/anialy/article/details/7620469

  1 #ifndef _HASHTABLE_
  2 #define _HASHTABLE_
  3 #include<iostream>
  4 using namespace std;
  5
  6
  7
  8 template<typename key_type,typename value_type>
  9 struct HashNode{
 10     key_type key;
 11     value_type value;
 12     HashNode* next;
 13     HashNode(key_type key,value_type value):key(key),value(value),next(NULL){}
 14     HashNode& operator =(const HashNode& rhs){
 15         key = rhs.key;
 16         value = rhs.value;
 17         next = rhs.next;
 18         return *this;
 19     }
 20     ~HashNode(){}
 21 };
 22
 23 template<typename key_type,typename value_type,typename Func>
 24 class HashTable{
 25 public:
 26     //enum{TableSize = 100};
 27     typedef HashNode<key_type,value_type>* pointer;
 28     HashNode<key_type,value_type>** table;
 29     unsigned long capacity;
 30     Func GetKeyValue;
 31     const value_type _null;
 32     HashTable(Func func,const value_type& _null);
 33     ~HashTable();
 34     void put(const HashNode<key_type,value_type>&);
 35     value_type del(const key_type& key);
 36     value_type getValue(const key_type& key);
 37 };
 38
 39 template<typename key_type,typename value_type,typename Func>
 40 HashTable<key_type,value_type,Func>::HashTable(Func func,const value_type& _null):_null(_null){
 41     GetKeyValue = func;
 42     capacity = 100000000;
 43     table = new HashNode<key_type,value_type>*[capacity];
 44     for(unsigned long i=0;i<capacity;i++)
 45         table[i]=NULL;
 46 }
 47
 48 template<typename key_type,typename value_type,typename Func>
 49 HashTable<key_type,value_type,Func>::~HashTable(){
 50     pointer node = NULL;
 51     for(unsigned long i=0;i<capacity;i++){
 52         node = table[i];
 53         while(node!=NULL){
 54             pointer temp = node;
 55             node = node->next;
 56             delete temp;
 57             temp = NULL;
 58         }
 59     }
 60     delete[] table;
 61 }
 62
 63 template<typename key_type,typename value_type,typename Func>
 64 void HashTable<key_type,value_type,Func>::put(const HashNode<key_type,value_type>& node){
 65     pointer hashnode=NULL;
 66     unsigned long index = GetKeyValue(node.key);
 67     hashnode = table[index];
 68     if(hashnode == NULL){
 69         HashNode<key_type,value_type>* temp = new HashNode<key_type,value_type>(node.key,node.value);
 70         table[index] = temp;
 71     }else{
 72         HashNode<key_type,value_type>* temp = new HashNode<key_type,value_type>(node.key,node.value);
 73         temp->next = hashnode;
 74         table[index] = temp;
 75     }
 76 }
 77
 78 template<typename key_type,typename value_type,typename Func>
 79 value_type HashTable<key_type,value_type,Func>::del(const key_type& key){
 80     unsigned long index = GetKeyValue(key);
 81     pointer hashnode = table[index];
 82     pointer pre = NULL;
 83     if(hashnode==NULL)return _null;
 84     if(hashnode->key==key){
 85         table[index] = hashnode->next;
 86         value_type revalue = hashnode->value;
 87         delete hashnode;
 88         table[index]=NULL;
 89         return revalue;
 90     }
 91     while(hashnode->key!=key&&hashnode!=NULL){
 92         pre = hashnode;
 93         hashnode = hashnode->next;
 94     }
 95     if(hashnode==NULL)return _null;
 96     pre->next = hashnode->next;
 97     value_type revalue = hashnode->value;
 98     delete hashnode;
 99     return revalue;
100 }
101
102 template<typename key_type,typename value_type,typename Func>
103 value_type HashTable<key_type,value_type,Func>::getValue(const key_type& key){
104     unsigned long index = GetKeyValue(key);
105     pointer hashnode = table[index];
106     if(hashnode==NULL)return _null;
107     while(hashnode->key!=key&&hashnode!=NULL)hashnode = hashnode->next;
108     if(hashnode==NULL)return _null;
109     return hashnode->value;
110 }
111 #endif

以上是头文件;



 1  #include<iostream>
 2   #include<time.h>
 3   #include<string>
 4   #include<cstdlib>
 5   #include"hashtable.h"
 6   using namespace std;
 7
 8   typedef unsigned long (*GetKeyValue)(const string& rhs);
 9   unsigned long get_key(const string& key){
10      unsigned long hash = 0;
11      unsigned long  i=0;
12      while(i<key.length())
13      {
14          // equivalent to: hash = 65599*hash + (*str++);
15          hash = key[i] + (hash << 6) + (hash << 16) - hash;
16          i++;
17      }
18
19      return (hash & 0x7FFFFFFF)>>8;//右移8位,是因为容易越界访问
20  }
21
22  int main(){
23
24      //传入一个求哈希散列值的方法get_key
25      HashTable<string,string,GetKeyValue> hashMap(get_key,"NULL");
26      for(int i = 0;i < 10000;i++){
27          char *ckey = new char[20];
28          char *cvalue = new char[20];
29          ckey = itoa(i,ckey,8);
30          cvalue = itoa(i,cvalue,8);
31          string key(ckey);
32          string value(cvalue);
33          if(i == 67){
34              key = "67";
35              value = "hello hash No.67";
36          }
37          HashNode<string,string> node1(key,value);
38          //插入该节点
39          hashMap.put(node1);
40      }
41      cout << "hashMap.GetValue(\"100\"): " << hashMap.getValue("100") << endl;
42      cout << "hashMap.Delete(\"67\"): " << hashMap.del("67") << endl;
43      cout << "hashMap.GetValue(\"67\"): " << hashMap.getValue("67") << endl;
44      return 0;
45  }
时间: 2024-10-13 12:26:01

简易的hashtable实现的相关文章

一个极简易 int 类型哈希表的实现

看了算法导论的影印版的哈希表时,开始还不太明白, 想了下后觉得似乎哈希表就是数组和链表的组合, 于是根据这个思路实现了一个最简易的哈希表. 这个其实我还是不太满意, 可能在以后会更新, 因为我觉得不满足 DRY 原则. class HashTable { private: const size_t initSize = 13; const int32_t hashNum = 13; vector<list<int32_t>> hashTable; int32_t Hash (con

十四、EnterpriseFrameWork框架核心类库之简易ORM

在写本章前先去网上找了一下关于ORM的相关资料,以为本章做准备,发现很多东西今天才了解,所以在这里也对ORM做不了太深入的分析,但还是浅谈一下EFW框架中的设计的简易ORM:文中有一点讲得很有道理,Dao与ORM的区别,Dao是对数据库操作的封装,编写的代码方式像一种设计方法,而ORM支持对象与数据结构的映射,更像一种代码开发工具,有了这个工具会让我们开发代码更简单方便:但是同一类工具有简单的也有复杂的,比如文字工具有简单的Notepad,也有复杂的Word,不是说有了复杂的简单的工具就不需要了

Android学习之路——简易版微信为例(二)

1 概述 从这篇博文开始,正式进入简易版微信的开发.深入学习前,想谈谈个人对Android程序开发一些理解,不一定正确,只是自己的一点想法.Android程序开发不像我们在大学时候写C控制台程序那样,需要从main开始写代码逻辑,大部分逻辑控制代码都由自己来实现.事实上,Android已经为我们提供了一个程序运行的框架,我们只需要往框架中填入我们所需的内容即可,这里的内容主要是:四大组件——Activity.Service.ContentProvider.BroadCast.在这四大组件中,可以

DataTable与DTO对象的简易转换类

在web开发过程中,有时候为了数据传输的方便,比如:后台需要更新前端的ViewModel,此时我们定义一个与前端ViewModel结构一样的DTO对象,从数据层获取数据后,将数据封装成DTO然后序列化为json传回前端,由于我正在开发的项目中的Model是用DataSet来实现的,不是纯粹的面向对象(如果Model是对象的话可以用AutoMapper来实现转换),所以从数据层获取的都是DataSet或DataTable,这时需要将DataTable转换为DTO对象,DTO对象的属性与DataTa

简易翻译工具

词库:预先准备本地文档,需要英文-中文形式存放,en~这个用表格实现将会更好 界面:一个简单的java GUI 功能:输入英文单词,回车,如果词库存在该单词,输出对应的中文意思,不存在则提示不存在 实现方法:Frame界面.事件监听.文档读取散列映射 具体实现: 0.预定义的词库 1.程序入口: 1 public class WordChangeMain { 2 3 public static void main(String[] args) { 4 5 WindowWord win = new

C#版简易RSS阅读器

C#版简易RSS阅读器.由VB版修改完成,感谢aowind的技术支持! 源代码: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Xml; using System.IO; using System.Threading; namespace Yu

HashMap和Hashtable

HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronization),以及速度. HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行). HashMap是非synchronized,而Hashtable

HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别

HashMap 是否是线程安全的,如何在线程安全的前提下使用 HashMap,其实也就是HashMap,Hashtable,ConcurrentHashMap 和 synchronized Map 的原理和区别.当时有些紧张只是简单说了下HashMap不是线程安全的:Hashtable 线程安全,但效率低,因为是 Hashtable 是使用 synchronized 的,所有线程竞争同一把锁:而 ConcurrentHashMap 不仅线程安全而且效率高,因为它包含一个 segment 数组,将

hashtable

HashTable是一种能提供快速插入和查询的数据结构,无论其包含有多少Item,查询和插入操作的平均时间总是接近O(1).hash function 的作用就是将这些范围很大的数(domain of keys )转换成我们需要的序号(domain of location)..net framework采用Division Methed作为其散列算法,使用取模(modulo)操作将Hash code值域转换到合适的范围.即:arrayIndex = hashcode % arraySize;其中