哈希表C++实现--hash_table

原创 2016年05月31日 10:57:49


1、hash_table.h

#include <iostream>
  3 #include <string>
  4 #include <string.h>
  5 #include <vector>
  6 #include <stdio.h>
  7 using namespace std;
  8 
  9 struct table_node
 10 {
 11     int _key;
 12     string _value;
 13     struct table_node *next;
 14     table_node(const int key,const string &value)
 15         :_key(key),_value(value),next(NULL)
 16     {}
 17 };
 18 
 19 
 20 class hash_table
 21 {
 22     private:
 23         vector<table_node*> vector_node;
 24         size_t size;
 25     private:
 26         size_t fun_index(const int key)
 27         {
 28             return key % vector_node.size();
 29         }
 30         size_t get_size()
 31         {
 32             const int len=10;
 33             static size_t arr[len]={53,97,193,389,769,1543,3079,6151,12289,24593};
 34             static int i=0;
 35             return arr[i++];
 36         }
 37         void init_hash_table()
 38         { 
 39             if(vector_node.size()==size)
 40             {
 41                 vector<table_node*> new_node;
 42                 size_t new_size=get_size();
 43                 new_node.resize(new_size);
 44                 //////////
 45                 //再把之前vector的数组拷贝到新的vector中
 46                 for(int i=0; i<vector_node.size(); ++i)
 47                 {
 48                     table_node *cur=vector_node[i];
 49 
 50                     while(cur !=NULL)
 51                     {
 52                         size_t index=fun_index(cur->_key);
 53                         table_node *tmp=cur;
 54                         cur=cur->next;
 55 
 56                         table_node *value=new_node[index];
 57                         if(value==NULL)
 58                             new_node[index]=tmp;
 59                         else
 60                         {
 61                             tmp->next=value->next;
 62                             value->next=tmp;
 63                         }
 64                     }
 65                 }
 66                 vector_node.swap(new_node);
 67             }
 68         }
 69     public:
 70         hash_table(size_t sz=0):size(sz)
 71         {}
 72         void insert(const int key,const string &value)
 73         {
 74             init_hash_table();
 75 
 76             table_node *tmp=new table_node(key,value);
 77 
 78             size_t index=fun_index(key);
 79             table_node *cur=vector_node[index];
 80         
 81             if(cur==NULL)
 82                 vector_node[index]=tmp;
 83             else if(cur !=NULL)
 84             {
 85                 tmp->next=cur->next;
 86                 cur->next=tmp;
 87             }
 88             size++;//在这让size++的目的是为了让负载因子为一,即一个下表下只挂一个数据
 89         }
 90         void show()
 91         {
 92             for(int i=0; i<vector_node.size(); ++i)
 93             {
 94                 cout<<"第"<<i+1<<"个:";
 95                 table_node *cur=vector_node[i];
 96                 while(cur !=NULL)
 97                 {
 98                     cout<<cur->_value<<"-->";
 99                     cur=cur->next;
100                 }
101                 cout<<" NULL"<<endl;
102             }
103         }
104         void remove(const int &key)
105         {
106             size_t index=fun_index(key);
107             table_node *cur=vector_node[index];
108             if(cur !=NULL)
109             {
110                 if(cur->next==NULL)
111                 {
112                     delete vector_node[index];
113                     vector_node[index]=NULL;
114                 }
115                 else
116                 {
117                     table_node *tmp=cur->next;
118                     cur->next=tmp->next;
119                     delete tmp;
120                 }
121             }
122         }
123 };  



2、

#include "hash_table.h"
  3 
  4 void fun_hash_table()
  5 {
  6     hash_table t;
  7     t.insert(2,"1-hello");
  8     t.insert(2,"2-hello");
  9     t.insert(2,"3-hello");
 10     t.insert(2,"4-hello");
 11     t.insert(3,"world");
 12     t.insert(4,"Hello");
 13     t.insert(5,"hello");
 14     t.show();
 15 }
 16 int main()
 17 {
 18     fun_hash_table();
 19     return 0;
 20 }
~               


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++简单实现hash table

哈希表(Hash Table,又称为散列表)是根据关键字(key)来直接访问在内存存储位置的一种数据结构。与循”值”访问对应的访问方式是循”址”访问,如数组、向量vector等。 哈希函数(Hash...

hash_map原理及C++实现

一、数据结构:hash_map原理 hash_map基于hash table(哈希表)。哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内...

C++ STL中哈希表 hash_map介绍

 0 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山...
  • ddkxddkx
  • ddkxddkx
  • 2011年06月20日 10:55
  • 49782

哈希表的应用(C++实现)

问题描述:设计哈希表实现电话号码查询系统,实现下列功能: (1) 假定每个记录有下列数据项:电话号码、用户名、地址。 (2) 一是从数据文件old.txt(自己现行建好)中读入各项记录,二是由系统...

C++ STL中哈希表 hash_map从头到尾详细介绍

0 为什么需要hash_map 用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改: ...

C++中使用STL的hashmap

转载自http://blog.csdn.net/sdhongjun/article/details/4517325 今天在使用STL中的hash_map模板遇到使用PTCHAR作为Key...
  • srzhz
  • srzhz
  • 2012年08月18日 23:36
  • 76909

【c++/数据结构】哈希表

哈希表哈希表(HashTable)又叫散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散...
  • LLZK_
  • LLZK_
  • 2016年11月06日 14:19
  • 781

c++ hash函数

std::hash template struct hash; Unary function object class that defines the default hash f...

c++ 哈希表(hash表)

一、定义 Hash表,也称散列表。一般应用于有大量“动态”的插入(删除)和查找操作的一类问题。(如果是“静态”的,通常可以先对数据排序,查找时就可以用“二分查找”) 虽然可以...
  • SBS2000
  • SBS2000
  • 2016年02月19日 13:38
  • 716

数据结构与算法——散列表类的C++实现(探测散列表)

散列表类的C++实现(探测散列表)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:哈希表C++实现--hash_table
举报原因:
原因补充:

(最多只允许输入30个字)