如果有写的不对的地方 请指出来, 博主也是初次了解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;
}