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())
复制代码

 

posted @   Steven_cs  阅读(6048)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示