HashMap数据结构的C++实现
Hash表在计算机的应用编程中是一种很常用的数据结构,很多算法的实现都离不开它。虽然C++11标准模板库中的有hashmap类型的实现,但在工程实践中,若项目本身使用的是较低版本的C++,或是出于性能的考虑,可能需要开发出一套独立的hashmap数据类型,从而能更加方便高效的维护相关业务。出于这种目的,有必要自己梳理一下其实现代码,并分享给大家。
至于hash表实现的原理主要就两种:1、链表法,2、开放地址法。在此以链表法来实现hashmap的数据结构,相关示例代码如下:
//创建HashMap的数据结构类型
template<typename KEY, typename VALUE, unsigned int NUM>
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数据结构的C++实现的更多相关文章
- HashMap数据结构与实现原理解析(干货)
HashMap 数据结构解析: HashMap内部使用hash表(本质是一个数组见图一) HashMap使用hash算法计算得到存放的索引位置,以此来加快查询速度,(比ArrayList还要快) 同样 ...
- 面试题 HashMap 数据结构 实现原理
数据结构 HashMap的数据结构 数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端. 数组:数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O ...
- 详解HashMap数据结构实现
HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢. HashMap是日常中非常常用的一种数据结构,我们要想深入了解学 ...
- JDK1.8的HashMap数据结构及红黑树
在JDK1.6,1.7中,HashMap的实现都是用基础的“拉链法”去实现,即数组+链表的形式.如下图:通过不同的hash值,来对数据进行分配存储. 关于HashMap的Entry长度,可以参考htt ...
- HashMap数据结构
2.1 HashMap 2.1.1 HashMap介绍 先看看HashMap类头部的源码: public class HashMap<K,V> extends AbstractMap< ...
- 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.8源码分析之HashMap(一)
一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也 ...
随机推荐
- MFC学习(七) 单文档程序
1 MFC单文档程序的主要类 (1)文档类(Document) 即应用程序处理的数据对象,文档一般从 MFC 中 CDocument 中派生.CDocument 类用于相应数据文件的读取以及存储 Cv ...
- springboot成神之——basic auth和JWT验证结合
本文介绍basic auth和JWT验证结合 目录结构 依赖 config配置文件WebSecurityConfig filter过滤器JWTLoginFilter filter过滤器JWTAuthe ...
- Python Twisted系列教程4:由Twisted支持的诗歌客户端
作者:dave@http://krondo.com/twisted-poetry/ 译者:杨晓伟(采用意译) 你可以在这里从头开始阅读这个系列. 第一个twisted支持的诗歌服务器 尽管Twist ...
- 「小程序JAVA实战」 小程序抽离公用方法进行模块化(12)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-12/ 小程序的模块化,把砖磊成一个墩子,用的时候把整个墩子移走.js更好的调用,应用更加公用化.源 ...
- Django详细介绍
课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...
- Entitlements
[Entitlements] Entitlements confer specific capabilities or security permissions to your iOS or OS X ...
- linux下rsync命令详细整理
点评:rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一详细说明,需要了解的朋友可以参考下-在对rsync服务器配置结束以后,下一步就需要在客户端发出rsync命 ...
- AlphaPose ubuntu16 python2安装
#https://www.tensorflow.org/install/install_linux#ValidateYourInstallation #https://github.com/MVIG- ...
- Solidity mapping循环
https://medium.com/@blockchain101/looping-in-solidity-32c621e05c22
- sql注意事项积累
1.一定要记住,SQL 对大小写不敏感! 2.sql中的单引号 '',如果单引号中是字符串,代表是常量 如,select 'b.phoneNumeber' from test; 如果是数字,如'123 ...