# C++关于哈希(hash)详讲
关联容器的类型
关联容器中的元素是按照关键字来保存和访问的。
1、set、map的基础概念
1、map是关键字-值对的集合。set是关键字的简单集合。
2、set、map都是有序容器,红黑树实现的。
3、map、set中的关键字都是唯一的,既,对于一个给点的关键字,只能有一个元素的关键
字等于它(具有去重的功能)。不能插入相同关键字的内容。
4、key_type 此容器类型的关键字类型
mapped_type 每个关键字关联的类型:只适用map
value_type 对于set,与key_type相同,对于map,为pair<const key_type,mapped_type>
对于set 类型,key_type和value_type是一样的;set保存的值就是关键字。对于map,元素是
关键字-值对。即,每个元素是一个pair对象,包含一个关键案子和一个关联的值。
5、maphash,pair是一个模板类型,保存两个名为first和second成员的数据成员。map所使用的
pair用first成员保存关键字,用second1成员保存对应的值。
2、unordered_set、unordered_map的基础概念
1、unordered_set、unordered都是无序容器、底层是哈希函数实现的。
2、无序容器再存储上组织为一组桶,每个桶保存零个或多个元素。无序容器使用hash函数将函数映射到桶上。为了访问一个元素,容器首先计算元素的哈希值,它指出应该搜索哪个桶,桶里存放这相同关键字的元素。
3、其余的大多于set和map相同。
3、常见哈希函数
1、直接定址法
缺点:需要事先知道关键字的分布情况。使用场景:适合查找比较小且连续的情况
2、除留余数法
设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函
数:Hash(key) = key% p(p<=m),将关键码转换成哈希地址
4、unordered_Set 的基本操作
unordered_map的操作几乎相同
//哈希表
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
unordered_set<ListNode*>hash; //定义一个unordered_set
ListNode*cur=head;
int i=0;
while(cur!=NULL&&i<4)
{
hash.insert(cur);//向hash插入数据操作
cur=cur->next;
i++;
}
//hash.erase(cue)删除操作
//hash.find(cur)查找操作,如果找不到就返回hash.end();
unordered_set<ListNode*>::iterator it=hash.begin(); //定义一个hash迭代器
//auto it=hash.begin()//另一种简介方法
while(it!=hash.end())
{
cout<<*it<<" ";
it++;
}
return head;
}
};
本文章为个人见解,可能会有错误的地方,欢迎指出
参考文章:C++ primer 第五版、http://t.csdn.cn/N0Amh
本文章为个人见解,可能会有错误的地方,欢迎指出
参考文章:C++ primer 第五版、http://t.csdn.cn/N0Amh