基于string的undered_map的实现

本文介绍了一种将字符串转换为整数的方法,并基于此实现了一个基于链表和顺序表的Hash表。探讨了两种不同的Hash表实现方式,包括插入、查找和删除等基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现一个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


`undered_set` 是 Python 提供的一个用于管理二进制数据的库。它主要用途是创建、读取和修改二进制数据文件,例如图片、声音、视频等媒体文件。 `undered_set` 库的主要特点是: - 内存占用小:可以处理很大的二进制数据文件而不会占用太多的内存。 - 支持多种数据类型:可以处理不同大小和类型的数据,包括整数、浮点数、字符串、布尔值等等。 - 高效的数据访问:可以快速读取和写入数据,支持随机访问文件中的任何部分。 下面是一个使用 `undered_set` 库创建、读取和修改二进制数据文件的简单示例: ```python import undered_set # 创建一个新的二进制文件 with undered_set.open('data.bin', 'wb') as fh: # 写入一些数据 fh.write_int(42) fh.write_float(3.14) fh.write_string('Hello, world!') # 打开已存在的二进制文件 with undered_set.open('data.bin', 'rb') as fh: # 读取数据 num = fh.read_int() flt = fh.read_float() msg = fh.read_string() print(num, flt, msg) # 修改二进制文件 with undered_set.open('data.bin', 'r+b') as fh: # 移动指针到数据起始位置 fh.seek(0) # 修改数据 fh.write_int(2019) fh.write_float(2.718) fh.write_string('Hello, Python!') ``` 在上面的示例中,我们使用了 `undered_set` 库的 `open()` 函数打开了一个名为 `data.bin` 的二进制文件。然后我们可以使用不同的方法来读写文件中的数据,并在必要时修改它们。最后,我们使用 `close()` 函数来关闭文件句柄,以确保文件被正确地保存和释放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值