使用unordered_set<pair<int,int>> unordered_map<pair<int,int>, bool>

本文介绍C++11特性下使用unordered_set<pair<int, int>>unordered_map<pair<int, int>, bool>的方法,int换为其他数据类型方法一致。

众所周知,基于红黑树(RB-Tree)setmap是可以使用std::pair的,而unoredered_setunordered_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
  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值