基于string的undered_map的实现

实现一个hash_map,要求key为string,valure任意

一 string 字符串转整数

方法1:将字符串中字符ASCII码值加起来,返回的值就是字符串对应的整数

如果存储的表很长,那么这种整数HASH后将导致集中在表前部分,分布不均衡;

方法2:

int string2int(const char *key){
int hashint=0;
while(*key!='\0'){
   hashint=(hashint<<5)+*key;
key++;
                              }
return hashint;
}

二 基于链表形式的hash_map

#ifndef _hash_link
#define _hash_link
class hash_node{
    public:
    int values;
    hash_node*next;
    hash_node():values(-1),next(NULL){}
    hash_node(int k):values(k),next(NULL){}
};
class table_node{
    public:
    int key;
    hash_node*ptr;
    public:
    table_node(int v):key(v),ptr(NULL){}
    table_node(table_node&s):key(s.key),ptr(s.ptr){}
};
class hash_link{
    private:
    int num;
    table_node* arr;
    public:
    hash_link(int nums):num(nums){
    arr=(table_node*)malloc(sizeof(table_node)*num);
    int i;
    for(i=0;i<num;i++)
    {
        table_node tmp(i);
        arr[i]=tmp;
    }
    }
    int Find(table_node a[],int m,int k){
        int i=k%m;
        hash_node*p=NULL;
        p=a[i].ptr;
        while(p&&p->values!=k)p=p->next;
        if(p)return i;
        return -1;
                                         }
    void Find(int k){
        int index1=Find(arr,num,k);
        cout<<k<<"is at"<<index1<<endl;
                     }
    void Insert(table_node a[],int n,int k){
        int i=k%n;
        hash_node*p=a[i].ptr;
        hash_node*s=new hash_node(k);
        if(p==NULL)a[i].ptr=s;
        else{
        while(p->next){p=p->next;}
        p->next=s;
             }
                                            }
    void Insert(int k){
        Insert(arr,num,k);
                      }
    void Remove(table_node a[],int n,int k){
        int i=Find(arr,n,k);
        if(i==-1)return;
        hash_node*p=a[i].ptr;
        if(p->values==k){a[i].ptr=p->next;delete p;}
        else{
        hash_node*q=a[i].ptr;
        while(p&&p->values!=k){q=p;p=p->next;}
        q->next=p->next;delete p;
             }
                                            }
    void Remove(int k){
        Remove(arr,num,k);
                       }
};
#endif

三基于顺序表形式的hash_map

class hash_seq{
    private:
	table_node1*arr;
	int nums;
    public:
	hash_seq(int m){
	nums=m;
	arr=(table_node1*)malloc(sizeof(table_node1)*nums);
	int i;
	for(i=0;i<nums;i++)
	{
	    table_node1 tmp(i,0);
	    arr[i]=tmp;
	}
	}
	int Find(table_node1 a[],int m,int k){
	int add=k%m;
	int i=0;
	while(a[add].flag!=0&&a[add].key!=k){i++;add=(add+1)%m;if(i==m)break;}
	if(a[add].key==k)return add;
	else return -1;
	}
	void Find(int k){
	    cout<<k<<"is at"<<Find(arr,nums,k);
	                 }
	void Insert(table_node1 a[],int m,int k){
	    int add=k%m;
	    int i=0;
	    while(a[add].flag!=0){add=(add+1)%m;i++;if(i>m)break;}
	    if(i>m)return;
	    a[add].flag=1;a[add].key=k;
	                                         }
	void Insert(int k){
	Insert(arr,nums,k);
	}
	void Remove(table_node1 a[],int m, int k){
	int add=Find(a,m,k);
	if(add==-1)return;
	a[add].flag=0;
	}
	void Remove(int k){
	Remove(arr,nums,k);
	}

	      };
#endif


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值