关于C++中的unordered_map和unordered_set不能直接以pair作为键名的问题

在 C++ STL 中,不同于有序的 std::mapstd::set 是基于红黑树实现的,std::unordered_mapstd::unordered_set 是基于哈希实现的,在不要求容器内的键有序,仅要求查找效率较高时,哈希实现的后者时更为合适的,哈希表的运用也经常出现在各种算法题中。

但是,我们知道,既然是基于哈希实现的,那么就需要指定哈希函数。对于内置的数据类型如 intfloatchar 等,STL 库已经帮助我们内置了常用的哈希函数。因此通常,我们在使用这些数据类型组成的 unordered_map 和 unordered_set 可以不再指定哈希函数,直接用默认的。这在 unordered_map 的类模板定义中也可看到:

template < class Key,            //容器中存储元素的类型class Hash = hash<Key>,    //确定元素存储位置所用的哈希函数class Pred = equal_to<Key>,   //判断各个元素是否相等所用的函数class Alloc = allocator<Key>   //指定分配器对象的类型> class unordered_set;

在这些参数重,只有第一个参数是没有默认值的。也就是说,在我们创建 intchar 等内置类型的 unordered_set 时只需要传入存储在容器中的类型即可。

但是,对于没有默认的哈希函数的类型,如自定义的 class 类型,pair 类型等,我们就必须自己指定一个哈希函数。这也是为什么直接构建 pair 类型的 unordered_set 如 unordered_set<pair<int, int>> uset 会出现问题(不会在声明时报错,而是在 insert 等操作时)。

对于这种情况,我们只需要将上面的第二个参数:确定元素存储位置所用的哈希函数,也在声明时传入就行了。关于哈希函数的选择,不同的情景会有所不同。这里笔者给出一个最简单的针对 pair 类型的哈希函数。

struct SimplePairHash {std::size_t operator()(const std::pair<int, int>& p) const {return p.first ^ p.second;}
};

在声明时直接将其传入即可:

std::unordered_set<std::pair<int, int>, SimplePairHash> S;
S.insert(std::make_pair(0, 1));

Ref :

https://stackoverflow.com/questions/21288345/unordered-set-of-pairs-compilation-error

https://blog.csdn.net/pineappleKID/article/details/108341064

关于C++中的unordered_map和unordered_set不能直接以pair作为键名的问题相关推荐

  1. 如何在Dev-Cpp中使用C++11中的函数:stoi、to_string、unordered_map、unordered_set、auto

    如果想要在Dev-Cpp里面使用C++11特性的函数,比如刷算法中常用的stoi.to_string.unordered_map.unordered_set.auto这些,需要在设置里面让dev支持c ...

  2. map、set和unordered_map、unordered_set对比

    一.区别与联系 ■map和set: map和set是依据红黑树来实现的.红黑树属于平衡二叉树,它们的增删改查操作的时间复杂度都是O(logN).              map是按照operator ...

  3. C++中的unordered_map用法详解

    1 简介 unordered_map是一个将key和value关联起来的容器,它可以高效的根据单个key值查找对应的value. key值应该是唯一的,key和value的数据类型可以不相同. uno ...

  4. C++ unordered_map和unordered_set的使用

    目录 一.unordered系列关联式容器 二.unordered_map 1. unordered_map介绍 2. unordered_map相关接口 三.unordered_set 1. uno ...

  5. C++ unordered_map 和 unordered_set 常用函数

    unordered_map 和 unordered_set unordered_map 是将由键值(key value)和映射值(mapped value)的组合形成的元素的关联容器,并且允许基于其键 ...

  6. php某列为键数组为值,PHP 将二维数组中某列值作为数组的键名 -- 超实用

    有时候,想通过数组的中某字段值, 然后再在二维数组中获取存在该字段值的数组: 一般能想到的就是foreach 遍历比较一下跟该字段值一样,就获取到想要的数组,如下: //测试二维数组 $arr =ar ...

  7. php获取数组中,相同键名的键值之和

    一.记录一下一个数组求相同键名的键值和的简便方法: 比如你有一个数组: $arr = array([0]=>array([0]=>array('user_id'=>100,'fiel ...

  8. php 获取数组最小值,php 获取数组中最小的值与键名的方法

    上一篇博文说的是php获取数组中最大的值与键名的方法,那么这篇博文就说一下php获取数组中最小的值与键名的方法.获取数组中最小的值可以使用php中的预设函数 min() ,其使用方法也非常的简单. p ...

  9. requests(二): json请求中固定键名顺序消除键和值之间的空格

    继上一篇requests发送json请求的文章后,实际工作中遇到了以下2种情况. 1:服务端要求json字符串,键名的顺序固定  2.服务端对于接收到的json数据中,若key和value之间有空格, ...

最新文章

  1. 腾讯云CentOS7.2+Django2.2+Python3.7+Nginx+Uwsgi 初学者部署教程
  2. OpenSSL(加密方式,加密算法,自签证书)
  3. Android网络请求开源框架retrofit的基本GET用法(2.4版本)
  4. fork source exec区别差异
  5. codeigniter 辅助函数 - 敏感词过滤
  6. 苹果手机的隔空投送怎么使用?
  7. librdkafka------C kafka Client
  8. Head First Java 目录结构
  9. Java 安装+环境配置(图文详解)
  10. Vue 爬坑之旅 -- 用自定义指令解决 IOS 12 中键盘收起后页面底部有留白的问题
  11. 网易邮箱无法正常登陆的解决技巧
  12. java 的vm是什么_java – 什么是VM,为什么动态语言需要一个?
  13. 荐读:FPGA设计经验之图像处理
  14. EtherCAT主站SOEM源码解析----ecx_siiPDO()
  15. 【C/C++】ifndef/define/endif的作用
  16. 解决OpenCV捕捉USB摄像头时抓帧失败的问题
  17. Python File文件处理 删除文件(remove)
  18. C#手机号码段生成 前7位补全后4位
  19. 606.根据二叉树创建字符串
  20. RabbitMQ 限流 流量削峰

热门文章

  1. 第13篇: Flowable-BPMN操作流程之流程进展查看之流程图
  2. 实战_01_Spring SpringMVC 整合Mybaits
  3. python 类定义 垃圾_什么是python对象摧毁?python中的对象摧毁(垃圾回收)机制是什么?...
  4. cbrt c语音_C语言有哪些鲜为人知的特性?
  5. java游戏可以刷升级挖药材,【毕业设计】Java手机游戏设计
  6. java调用js查询mongo_MongoDB增删查改操作示例【基于JavaScript Shell】
  7. java script中==和===_Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑...
  8. mysql for loop_MySQL循环语句 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 找规律万能公式_有一个万能公式,可以帮你解决任何烦恼!
  10. java jaxb注解xmlnull_java – 将空值表示为xml jaxb中的空元素