本文介绍C++11特性下使用unordered_set<pair<int, int>>
与unordered_map<pair<int, int>, bool>
的方法,int换为其他数据类型方法一致。
众所周知,基于红黑树(RB-Tree)的set
与map
是可以使用std::pair
的,而unoredered_set
与unordered_map
的内部实现是基于哈希表(HashTable),并没有直接提供pair
接口,其原因与哈希表的特性相关。
阅读更深的内容可以参考C++ STL 之 unordered_set 介绍
必备知识:什么是哈希?
问题1:平面上每个点的x轴、y轴范围为[1,100],现在需要统计有多少个不同点?
- 我们需要构造一个哈希值,
唯一地表示
每个点{x, y} - 因为x和y的范围都是100,所以
x*100 + y
可以唯一表示
点{x, y}
问题2:在PAT甲级1139 —— First Contact 这道题中,每个人的编号都是一个4位数,其中两两配对(如1001和2001、1002和2003)。
- 我们需要构造一个哈希值
唯一表示
这个配对。 - 因为都是4位数,所以
a*10+b
一定可以唯一表示
匹配{a, b};或者如a*100+b
也一定可以唯一表示
匹配{a, b};或者如a*1000+b
也一定可以唯一表示
匹配{a, b} …
问题3:在POJ 3349 —— SnowflakeSnowSnowflakes这道题中,每片雪花由6个数字组成,我们需要构造这6个数字的哈希(构造的数值需要唯一表示
一片雪花)
- 我们观察到:对于6个数都相同的雪花,他们6个数之和、6个数之积都应该相等。
- 因此,我们可以用6个数的和作为一个雪花的哈希;也可以用6个数的乘积;使哈希值更
“唯一”
的办法是用6个数的和加6个数的乘积;更更“唯一”
的办法是用6个数的和乘6个数的乘积;
对于问题1
#include<bits/stdc++.h>
using namespace std;
struct pair_hash {
inline size_t operator()(const pair<int,int> & p