C++哈希表使用详解
哈希表
哈希表(Hash table)以<key, value>这种 键----值 对的形式存储数据的一种数据结构。
哈希表也叫散列表,其中通过key访问一个映射表来得到value的地址,这个映射表也叫做哈希函数或者散列函数,而存放value的数组叫做散列表。简单说,数组就是一张哈希表,我们使用数组下标访问数组中的内容时,和我们使用key去访问哈希表中对应的value一样。
多个key可以指向同一个value,但是每个key只有一个value与之对应。
哈希函数有多种(直接寻址、数字分析、平方取中、随机数、除留取余)。
散列表冲突时解决方法(开放地址法、再哈希、链地址、公共溢出区)。
常用的哈希结构
数组
set(集合)
map(映射)
其中关于 set 和 map 的一些分类和对比如下:
数据结构 | 底层实现 | 数值是否有序 | 数值是否可重复 | 数值是否可更改 | 查询效率 | 增删效率 |
set | 红黑树 | 有序 | 否 | 否 | O(log n) | O(log n) |
multiset | 是 | |||||
unordered_set | 哈希表 | 无序 | 否 | O(1) | O(1) | |
map | 红黑树 | key有序 | key不可重复 | key 否 | O(log n) | O(log n) |
multimap | key可重复 | |||||
unordered_map | 哈希表 | key无序 | key不可重复 | O(1) | O(1) |
底层实现
我们可以看到,底部实现不是哈希表就是红黑树。
红黑树是一种自平衡二叉查找树。(详解待更新。。。。)
数值是否有序和是否可重复
数值是否有序也是我们选择使用 map、multimap 和 unordered_map 哪种结构的一个重要参考。因为根据查询和增删效率可以看出,unordered_map的效率明显比较高,所以当没有特殊要求的时候就选择unordered_map,但是如果需要我们的集合是有序的话,那就要选择 map 和 multimap ,如果要求不可重复就只能使用map。总之根据自己的需求选择相对应的数据结构。
这里举个数值有序例子: 如果我们依次输入如下键值对
{2,a},{1, b},{3,c}
遍历 unordered_map 输出顺序 和原本顺序一样
2----a
1----b
3----c
但是map会在输入时对key值进行排序,所以输出结果为
1----b
2----a
3----c
map的一些操作
#include<unordered_map> //头文件
unordered_map<int, int> mymap; //定义一个map
//插入 ----两种都行
mymap.insert({1, 2});
mymap[1] = 2;
//删除
mymap.erase(1);
//判空
if(mymap.empty()) {};
//遍历 两种都行
for(auto &c : mymap)
cout << c.first << c.second << endl;
for(auto &[u, v] : mymap)
cout << u << v << endl;
//查找
for(mymap.find(1) == mymap.end())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报