哈希表(键值对)
键(key):类似于数组的下标,可以为任意类型,但是不能重复
值(val) :类似于数组的元素,可以为任意类型哈希表不存在元素访问溢出的情况,只要访问未创建的元素,便会创建一个值为0的键值对
哈希表的插入:
//方法一:
【】法(中括号法)
//方法二:
insert()函数插入法
#include <iostream>
#include <string>
#include<unordered_map> //无序哈希表
#include<map> //有序哈希表
using namespace std;
/*
哈希表(键值对)
键(key):类似于数组下标,可以是任意类型,但不能重复
值(val):类似于数组中的元素
*/
int main() {
unordered_map<int ,char > map;//创建 键:int类型 值: char类型 的哈希表
unordered_map<int , int > map1;
//向哈希表中插入元素
//[]法 (【】本质为运算符)
map[1] = 'a';
map1[1] = 111;
map1[2] = 222;
cout << map1[2] << endl;
cout << map1[3] << endl;//map1[3]中没有元素,因此会在map1[3]中插入(3,0)
//insert()函数法
pair<int, int > p = make_pair(7, 7);//创建pair数据对
cout << "pair的第一个元素是:" << p.first << "pair的第二个元素是:" << p.second << endl;
map1.insert(p);//利用insert传入数据对p
map1.insert(make_pair(8, 8));//利用insert传入make_pair()
return 0;
}
利用哈希表的迭代器
- 查询key的val
- 循环赋值
- 遍历哈希表
-
#include <iostream> #include <string> #include<unordered_map> //无序哈希表 #include<map> //有序哈希表 using namespace std; /* 哈希表(键值对) 键(key):类似于数组下标,可以是任意类型,但不能重复 值(val):类似于数组中的元素 */ int main() { unordered_map<int, int > map;//创建 键:int类型 值: char类型 的哈希表 unordered_map<int, int >::iterator it;//哈希表的迭代器 for (int i = 0; i < 5; i++) { map[i] = i; } it = map.begin();//map.begin()返回指向哈希表首元素的迭代器 //map.end():返回指向哈希表最后一个元素的下一位的迭代器 for(const auto &it:map){//争强for循环哈希表 //其中的it代表的是map哈希表里面的各种元素 //auto(推断类型,根据赋值的类型推断变量的类型) cout<<it.first<<" "<<it.second<<endl; } for (; it != map.end(); it++) {//迭代器遍历哈希表 cout << it->first << " " << (*it).second << endl; //->和* 两种不同的方式返回迭代器指向的两个值 } //查找find(key);如果存在键为key的键值对,返回该键值对对应的迭代器,否则返回end(); if (map.find(3) != map.end()) { cout << "找到了" << endl; } else { cout << "没找到" << endl; } return 0; }
无序哈希表的实现(unordered_map):
无序哈希表:在键盘输入的键值对会随机分配成任意的顺序
无序哈希表的组成:数组+哈希函数
原理:
无序哈希表在存储数据的时候,会将键(key)放入到哈希函数中进行计算
哈希函数会返回对应的一个int类型的数值n
紧接着会对n进行 处余桶个数的计算=i(桶:类似于数组),其返回值必然是小于桶的整数
于是会将值(valval)存储到对应的桶的 i(下标)处
因此,在经历上述操作下,存入哈希表的数值将会以乱序(非人为输入数)的形式进行存储
哈希函数:
一般的哈希函数都是采用除留余数法(f(key) % m)m不会超过表长
哈希函数的特征:
1、输入域 f(string)无穷大(输入可以是字符串),输出域有限(int类型的范围限制)
2、有可能不同的输入对应相同的输出(哈希表冲突)
3、如果输入的参数是相同的,那么输出一定是相同的,没有任何的随机成分(查找、删除、修改)
4、均匀性:类似的输入,通过打乱,得到均匀的输出
哈希冲突的解决方法(哈希碰撞):
1、线性冲突再散列:(无脑硬算法)
对于val=99的这个数据,经过哈希函数求得,应放入key=2的位置,但是key=2的位置存在数据,因此将会一位一位的向后进行查找,直到发现val为空的哈希表位置,并且将其存入
2、再哈希表法:(无脑硬算法)
类似于【线性冲突再散列】的方法,一旦发现有key的位置发生碰撞,那么会在100多种哈希函数中寻求另外一种哈希函数,直到没有位置冲突为止
3、链地址法(java hashmap 就是采用的这种方法)
在c++和java的哈希表中,都是采用该方法
【数组】+【链表】+【哈希函数】,其时间和空间复杂度大概接近于 O(1)
4、建立一块公共溢出区
在发生哈希碰撞的时候,将冲突的数据放入该公共溢出区,以此来解决哈希冲突
标签:map,哈希,int,键值,key,原理,include From: https://blog.csdn.net/s386199/article/details/140420039