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++实现的更多相关文章

  1. HashMap数据结构与实现原理解析(干货)

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

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

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

  3. 详解HashMap数据结构实现

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

  4. JDK1.8的HashMap数据结构及红黑树

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

  5. HashMap数据结构

    2.1 HashMap 2.1.1 HashMap介绍 先看看HashMap类头部的源码: public class HashMap<K,V> extends AbstractMap< ...

  6. Java的HashMap数据结构

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

  7. 转发 java数据结构之hashMap详解

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

  8. Java中常见数据结构Map之HashMap

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

  9. 【集合框架】JDK1.8源码分析之HashMap(一)

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

随机推荐

  1. Vue.js:组件

    ylbtech-Vue.js:组件 1.返回顶部 1. Vue.js 组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让 ...

  2. 基本教程篇--第一节:InitialSampleDemo.cs介绍

       第一节:InitialSampleDemo.cs介绍         为了讲解方便,我先附上源代码和效果图. 代码如下: using System; using System.Drawing; ...

  3. rpm yum 等命令无响应的解决方法

    yum 安装查询任何东西, rpm 安装查询任何东西,执行后无任何反应,直接卡住,也没任何错误信息给出,只能杀掉进程 # yum install XXXX # yum clean all # rpm ...

  4. C语言运算符优先级和口诀 (转)

    一共有十五个优先级: 1   ()  []  .  -> 2   !  ~   -(负号) ++  --   &(取变量地址)*   (type)(强制类型)    sizeof 3   ...

  5. C++虚函数与纯虚函数用法与区别(转载)

    1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class) ...

  6. EF的左连接查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...

  7. 主机不能访问虚拟机中的web服务【解决方案】

    百度了其它一些方法都不行,最后实在没辙,关了windows防火墙和Linux防火墙,居然能够访问了,我服. 总结一下,原来是Red Hat Linux 6.0防火墙没有开启端口80,开启的方法为(老版 ...

  8. 【bzoj1015】星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5139  Solved: 2332[Submit ...

  9. AntD02 Table组件的使用

    1 前提准备 1.1 创建一个angular项目 1.2 将 Ant Design 整合到 Angular 项目中 1.3 官方文档 点击前往 2 简单使用 <nz-table #rowSele ...

  10. Java Http 请求

    package zr.weixin.com.utils; import java.io.BufferedReader; import java.io.IOException; import java. ...