hashmap 原理讲解

本文介绍了哈希表的基础知识,以C++中的unordered_map为例,阐述了HashMap的工作原理。哈希表通过hash_fun哈希函数确定数据存储的桶位置,使用equal_to解决冲突。在示例中,自定义了hash和equal_to函数,展示了如何将自定义类型插入unordered_map并遍历输出。
摘要由CSDN通过智能技术生成

如果有写的不对的地方 请指出来, 博主也是初次了解hashmap

具体先看图:

在这里插入图片描述

实现细节

1: hashmap 会分配一大片内存(vector)也就是桶,但他并不会保存数据只是一个编号,这个编号怎末来的, 是通过他的hash_fun 哈希函数得来的。 简称 hashcode 然后通过对桶进行运算(这块并不是唯一, 根据经验进行运算得到一个值就编号了)
2:每个 编号底下对应的是各自的链表,也就是说编号指向的是list 的node 节点。真正的数据pair 存储在 list 里面
假设: 如图上图所示
这里有几个数字, 0, 12, 4,10,
对桶取模
0%6 = 0 12 %6 =0 也就是存储在编号为0的桶里面
4%6 = 4 10 %6 =4 也就是存储在编号为4的桶里面

以上操作,涉及到两个知识点:

  • hashfun (直接定址)
    这个好理解就是让数据知道放在哪个桶里面
  • equal_to (解决冲突)
    上面看到有好几个数据的编号一样,都在同一个桶里。这就是为了解决冲突
    如果hashmap==> key 是自定义类型 以及string 以上两个函数要自己实现

代码案例

class yang
{
public:
    yang(int num)
    {
        num_ = num;
    }
    // equal_to 函数
    bool operator==(const yang& obj)const
    {
        return num_==obj.num_;
    }
    int num_;
};
// hash 函数里面具体实现不是唯一,根据实际情况
struct hash_A{
        size_t operator()(const  yang & A)const{
                return A.num_;
        }
};
int main()
{
    std::unordered_map<yang, std::string,hash_A> u = {
           {yang(1),"#FF0000"},
           {yang(0),"#00FF00"},
           {yang(2),"#0000FF"},
           {yang(3),"#0000FF"}
       };
    for( auto &pair : u ) {
            std::cout << "Key:[" << pair.first.num_
                      << "] Value:[" << pair.second << "]\n";
        }

    return 0;
}

参考博客:C++ STL 之哈希表 | unordered_map

参考博客:hashCode 方法及 equals 方法的规范

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值