c语言字符串hashmap,HashMap数据结构的C++实现

本文介绍了如何在C++中自定义实现一个HashMap数据结构,使用链表法处理冲突。详细展示了HashMapper类的代码实现,包括Select、Insert、Remove等关键操作。此外,还解释了哈希表的工作原理,以及从字符串到哈希值的转化方法Key2Hash。
摘要由CSDN通过智能技术生成

Hash表在计算机的应用编程中是一种很常用的数据结构,很多算法的实现都离不开它。虽然C++11标准模板库中的有hashmap类型的实现,但在工程实践中,若项目本身使用的是较低版本的C++,或是出于性能的考虑,可能需要开发出一套独立的hashmap数据类型,从而能更加方便高效的维护相关业务。出于这种目的,有必要自己梳理一下其实现代码,并分享给大家。

至于hash表实现的原理主要就两种:1、链表法,2、开放地址法。在此以链表法来实现hashmap的数据结构,相关示例代码如下:

//创建HashMap的数据结构类型

template

class HashMapper

{

public:

struct item

{

item(const KEY &key, const VALUE& value):first(key),second(value),next(NULL){}

item(const KEY &key):first(key),next(NULL){}

item():next(NULL){}

KEY first;

VALUE second;

item* next;

};

public:

HashMapper();

virtual ~HashMapper();

item* Select(const KEY &key);

const item* Select(const KEY &key) const;

int Insert(const KEY &key, const VALUE& value);

int Remove(const KEY &key);

VALUE& operator[](const KEY &key);

protected:

;

item* hash_bucket[NUM];

};

//得到指定key的map节点

Select(const KEY &key)

{

unsigned int value;

Key2Hash(key, value);

item* pCur = hash_bucket[value];

while(pCur != NULL)

{

if (key == pCur->first)

{

return pCur;

}

pCur = pCur->next;

}

return NULL;

}

// 向hashmap中插入键值对

Insert(const KEY &key, const VALUE& value)

{

unsigned int hashvalue;

Key2Hash(key, hashvalue);

//hash位置没有内容

if (hash_bucket[hashvalue] == NULL)

{

hash_bucket[hashvalue] = new item(key, value);

;

}

item* pCur = hash_bucket[hashvalue];

do

{

if (key == pCur->first)

{

;

}

if (pCur->next == NULL)

{

break;

}

else

{

pCur = pCur->next;

}

}

);

pCur->next = new item(key, value);

;

}

//删除指定key值的节点

Remove(const KEY &key)

{

unsigned int hashvalue;

Key2Hash(key, hashvalue);

item* pCur = hash_bucket[hashvalue];

item* pLast = NULL;

while(pCur != NULL)

{

if (key == pCur->first)

{

if (pLast == NULL)

{

hash_bucket[hashvalue] = pCur->next;

}

else

{

pLast->next = pCur->next;

}

delete pCur;

;

}

pLast = pCur;

pCur = pCur->next;

}

;

}

//由字符串转化为hash值,如若要求保证唯一性,则可利用MD5来转化成u long long类型

void Key2Hash(const KEY & index, unsigned int & hashvalue)

{

hashvalue = ;

int len = index.strlen();

; i < len; ++i)

{

hashvalue = ((unsigned char)index[i] + hashvalue) % hashsize;

}

}

以上示例主要实现思路是,每个KEY值经hash变换后生成对应的hashvalue,由hashvalue可在数组所构成的所有“桶”中找对指定的桶,再遍历桶中所有的KEY值,直到找到为止。

HashMap数据结构与实现原理解析&lpar;干货&rpar;

HashMap 数据结构解析: HashMap内部使用hash表(本质是一个数组见图一) HashMap使用hash算法计算得到存放的索引位置,以此来加快查询速度,(比ArrayList还要快) 同样 ...

面试题 HashMap 数据结构 实现原理

数据结构 HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O ...

详解HashMap数据结构实现

HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...

JDK1&period;8的HashMap数据结构及红黑树

在JDK1.6,1.7中,HashMap的实现都是用基础的“拉链法”去实现,即数组+链表的形式.如下图:通过不同的hash值,来对数据进行分配存储. 关于HashMap的Entry长度,可以参考htt ...

HashMap数据结构

2.1 HashMap 2.1.1 HashMap介绍 先看看HashMap类头部的源码: public class HashMap extends AbstractMap&lt ...

Java的HashMap数据结构

标题太大~~~自己做点笔记.别人写得太好了. https://www.cnblogs.com/liwei2222/p/8013367.html HashMap 1.6时代, 使用Entry[]数组, ...

转发 java数据结构之hashMap详解

概要 这一章,我们对HashMap进行学习.我们先对HashMap有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashMap.内容包括:第1部分 HashMap介绍第2部分 HashMa ...

Java中常见数据结构Map之HashMap

之前很早就在博客中写过HashMap的一些东西: 彻底搞懂HashMap,HashTableConcurrentHashMap关联: http://www.cnblogs.com/wang-meng/ ...

【集合框架】JDK1&period;8源码分析之HashMap(一)

一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也 ...

随机推荐

&lbrack;Ubuntu&rsqb;&lbrack;Linux&rsqb;更改PATH路径

1.什么是环境变量(PATH) 在Linux中,在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的文件先执行. 我们知道查阅文件属性的指令ls 完整文件名为:/ ...

android 获取当前屏幕作为毛玻璃模糊背景Acitivity作为弹出框。

使用: 1.在执行弹出界面前,先将其当前屏幕截图. BlurBuilder.snapShotWithoutStatusBar(getActivity()); 2.为了确保界面切入无效果. startA ...

遍历并remove HashMap中的元素时,遇到ConcurrentModificationException

遍历并remove HashMap中的元素时,遇到ConcurrentModificationException for (Map.Entry

python在接口测试的实际应用

今天看到@51Testing软件测试网 关于"关于接口测试的总结"的文章,进去浏览了一下,文章主要是针对接口测试的理论性的描述,而实战的内容没有涉及到.刚好今天我将我的系列文章的& ...

python3随机数函数

随机数函数 choice(seq) 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数. randrange ([start,] stop ...

【shiro】&lpar;5&rpar;---基于Shiro的权限管理

基于Shiro的权限管理项目搭建 前面写了四篇有关权限的文章,算是这篇文章的铺垫了.这篇文章采用 开发环境           JDK1.8          Eclipse          Mav ...

c&num; 十进制转二、八、十六进制

一.十进制转二.八.十.十六进制字符串 Convert.ToString(int decNum,int toBase); decNum为十进制字符串, toBase可以为2.8.10.16 如果要转换 ...

XCode9的新变化

XCode9已经随着ios11的发布发布了,那么在这个XCode9版本中有哪些变化呢? 1 折叠代码 焦点在方法的实现体的方法名上,按comman键,则整个函数会被框住.用来标志这个方法的起点和终点 ...

word2016&lowbar;添加标题和目录

标题 开始->标题(层级可选) 目录 引用->目录->自动目录

spring boot 使用spring&period;resources&period;static-locations 分离系统模版&amp&semi;&amp&semi;资源文件

方便我们将资源配置以及模版&&静态文件分离出来,而不是打包在一起,比如以下的一个demo 参考配置: server.port=8006 spring.application.name= ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值