c++之复杂类型作为unordered_map的键值

2023-11-01

unordered_map & unordered_set

我们知道c++中有unordered_map和unordered_set这两个数据结构,其内部实现是哈希表,这就要求作为键值的类型必须是可哈希的,比如常见的数据类型int、string等。但在很多应用中我们可能需要用到比较复杂的类型作为键值,比如vector<int>、pair<int,int>,乃至自定义的类,这时候就需要手动编写两个类作为创建该数据结构对象时的参数,具体我们来看一下。

现在我想让pair<int,int>作为unorderd_map的键值,需要编写两个类,每个类中分别包含一个函数,第一个类中的函数叫做哈希函数,将某一个pair<int,int>的对象哈希了,返回其哈希值;第二个叫做相等函数,用于判断两个pair<int,int>对象是否相等,意在解决冲突。

ps:类与结构其实是类似的,可以相互替代使用

struct Hashfunc {
    size_t operator() (const pair<int,int>& key) const{
        return hash<int>()(key.first) ^ hash<int>()(key.second);
    }
};
struct Equalfunc {
    bool operator() (const pair<int,int>& a, const pair<int,int>& b) const{
        return a.first == b.first && a.second == b.second;
    }
};

这两个类的具体实现完全由你自己决定,只是需要注意一点,因为这两个类是作为参数传递给unordered_map的,所以定义时需要满足某些规则,比如Hashfunc的返回值是size_t,再比如Equalfunc里的判断函数必须添加const字段。

编写完以上两个类,将它们传给要创建的数据结构对象,然后就可以使用啦。

unordered_map<pair<int,int>, int, Hashfunc, Equalfunc> mp;

map & set

上面讲的是unordered_map和unordered_set的应用,如果是map和set呢?我们知道map和set内部的实现是树,既然运用到二叉搜索树就必须得有比较两个元素大小的方法,上面提到的pair<int,int>和vector<int>,好像map自动提供给其比较的方法了,所以可以直接作为键值使用,不用自己定义类。

什么时候需要自己定义类呢?答案是使用自定义类作为键值的时候。与上面类似,我们现在定义一个类,类中的函数我们同样给它一个名字,就叫小于函数吧,这个函数用来判断两个元素值的大小。
如下:

class T {
	public:
	int a,b;
	T(int c, int d) {
		a = c;
		b = d;
	}
};
struct Tless {
	bool operator() (const T& a, const T& b) {
		return a.a < b.a;
	}
};
map<T, int, tless> mp2;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++之复杂类型作为unordered_map的键值 的相关文章

  • 如何防止 Json.NET 将枚举转换为字符串?

    下面的课 public class RequestSections RequestBase public RequestSections Command c Dictionary
  • 更改 Visual Studio 2015 扩展中项目内的文件 ProjectItem 的内容?

    如何更改文件的内容 ProjectItem在给定的范围内Project 我想用字符串替换它的所有内容 这个问题有解决办法吗 我想做一些改变ProjectItem CS 文件 通过使用 VSIX 包 以及我现在看到的唯一一种执行此操作的方法
  • 除了第一列之外,Gridview 行可点击?

    我使用以下代码使 gridview 的整行可单击 protected void gridMSDS RowDataBound object sender GridViewRowEventArgs e if e Row RowType Data
  • Ruby 解释器嵌入到 C 代码中

    我只是尝试书中的一个简单例子 我有一个 sum rb 文件 class Summer def sum max raise Invalid maximum max if max lt 0 max max max 2 end end 还有一个
  • 使用inotify监控文件

    我正在使用 inotify 来监视本地文件 例如使用 root temp inotify add watch fd root temp mask 删除该文件后 程序将被阻止read fd buf bufSize 功能 即使我创建一个新的 r
  • C++ 中的字符串到 LPCWSTR

    我正在尝试从字符串转换为 LPCWSTR 我使用多位 1 例如 LPCWSTR ToLPCWSTR string text LPCWSTR sw LPCWSTR text c str return sw 2 返回中文字符 LPCWSTR T
  • 实体框架 5 不清除导航属性

    我在 Entity Framework 5 中遇到了这个奇怪的问题 我在其中一个实体中有一个导航属性 我想将其设置为null 但由于某种原因 该属性只有在我第二次调用该属性时才会被清除 using var db new Entities v
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • DLL 需要访问其应用程序的符号

    在 C 中 DLL 是否可以访问加载它的应用程序的某些符号 我有一个加载插件 dll 的应用程序 这些插件需要访问该应用程序的某些API 是否可以在不创建共享此 API 的新 DLL 的情况下实现此目的 函数指针结构适合这种情况吗 示例 主
  • 我需要一个树转储选项,该选项在当前的 gcc 版本中不再存在

    旧版本的 GCC 例如 4 0 2 或 4 1 2 有该选项 df see 用于调试程序或 GCC 的选项对于4 1 2 http gcc gnu org onlinedocs gcc 4 1 2 gcc Debugging Options
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • 当应用程序未聚焦时监听按键

    我有一个应用程序 C 4 0 WPF 它是隐藏的 可以通过单击系统托盘图标或我创建的其他框架 停靠在左侧和最上面的小框架 来显示 My customer wants to add a new way to display the appli
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • CS0246 找不到类型或命名空间名称“ErrorViewModel”(您是否缺少 using 指令或程序集引用?)

    我收到 CS0246 错误代码 我正在做一个 MVC net core 项目 我正在将 Razor 合并到我的 C 代码中 我在进行构建时收到此错误 我在最后一行收到错误 有人能帮我解决这个问题吗 global Microsoft AspN
  • C++ 静态工厂构造函数

    我正在进行模拟 它需要创建多个相当相似的模型 我的想法是有一个名为 Model 的类并使用静态工厂方法来构造模型 例如 模型 createTriangle or 模型 createFromFile 我从以前的 java 代码中汲取了这个想法
  • System.Drawing.Icon 构造函数抛出“操作成功完成”异常

    在 Windows XP 计算机上 以下代码抛出 System ComponentModel Win32Exception 并显示消息 操作成功完成 System Drawing Icon icon new System Drawing I
  • std::regex 转义正则表达式中使用的特殊字符

    我是字符串来创建一个std regex FILE 作为单元测试的一部分 检查一些打印文件名的异常输出 在 Windows 上失败并显示 regex error error escape 表达式包含无效的转义字符或尾随转义 因为 FILE 宏
  • TypeScript 中 C# 类虚拟成员的等效项

    因此 在 C 中 当我创建模型类和延迟加载内容时 我会执行以下操作 public int User ID get set public int Dept ID get set 然后在我的班级稍远一点的地方 我像这样弹出我的虚拟 public
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • GetActiveObject() 与 GetObject() -- MK_E_UNAVAILABLE 错误

    All 我在将一些 VBA 代码转换为 C 时遇到一些问题 我们有一个充当本地 COM 服务器的第 3 方应用程序 在我们使用的VBA代码中获取对象 获取对现有对象的引用 e g Set appHandle GetObject ProgId

随机推荐

  • MySQL优化派生表_sql优化-派生表与inner-join

    首先来说明一下派生表 外部的表查询的结果集是从子查询中生成的 如下形式 select from select dt 如上形式中括号中的查询的结果作为外面select语句的查询源 派生表必须指定别名 因此后面的dt必须指定 派生表和临时表差不
  • PAP认证和CHAP认证概述

    http network 51cto com art 201109 291563 htm PAP认证过程非常简单 是二次握手机制 而CHAP认证过程比较复杂 是三次握手机制 下面就让我们来看一下两种具体的认证过程 AD 一 PAP认证协议
  • opencv-python下载地址

    https pypi org project opencv python history
  • Python3.x安装Pandas教程

    python3 x 安装pandas总是会出现一些乱七八糟的问题 那现在就给你们讲述一种超级简单的安装方法 非常简单 1 检查自己的python版本 我的是python3 4 32位的 2 https www lfd uci edu goh
  • Jupyter Notebook修改工作区默认路径

    Jupyter notebook启动后 默认的工作空间是当前用户目录 C Users 用户名 为了方便对文档进行管理 往往需要自行设置工作空间 下面是默认工作空间的设置方法 一 修改属性中目标位置 右击 jupyter notebook 快
  • Java JDBC(JdbcTemplate)对表的增删改查

    Java JDBC JdbcTemplate 对表的增删改查 先看 JDBCUtils 再看 JdbcTemplate简单使用 然后增删改查 package domain import JdU JDBCUtils import org ju
  • Unity3d 周分享(22期 2019.8.30 )

    选自过去1 2周 自己所看到外文内容 https twitter com unity3d 和各种其他博客来源吧 早就有了 抱歉才发 1 Unity Transform 性能优化摘要 https qiita com sator imaging
  • linux下搭建RabbitMQ操作

    引言 你是否遇到过两个 多个 系统间需要通过定时任务来同步某些数据 你是否在为异构系统的不同进程间相互调用 通讯的问题而苦恼 挣扎 如果是 那么恭喜你 消息服务让你可以很轻松地解决这些问题 消息服务擅长于解决多系统 异构系统间的数据交换 消
  • php isset 和 array_key_exists 检查数组中是否存在某值的区别

    原文地址 http ivhong com p 110 ivhong com 是我的博客主址 先看看下面这段代码 你觉得结果是什么呢 定义一个数组 gt 5 4 arr a gt null var dump isset arr array k
  • tilemap45度地图的斜向限定判断办法

    前段时间使用cocos2d x做一个小游戏用到了tilmap 而且是45度的tilemap 在正常的坐标系里面一般都是直角坐标系 但是这个东西可以是斜的 要想使用45度的tilemap地图就要进行坐标系的转换 有空再写怎么转换 然后看一些用
  • springboot面试题

    springboot常见面试题 https blog csdn net weixin 44772609 article details 115106450 常见面试题 谈谈你对Spring Boot的理解 SpringBoot主要用来简化使
  • HttpRunner 2.x接口自动化实战

    1 环境准备 测试环境 python3 8 httprunner版本为2 5 7 pip install httprunner 2 5 7 检查安装结果 httprunner V 创建项目 使用 httprunner命令创建一个项目 htt
  • pycharm引入anaconda创建的虚拟环境及对应的python解释器

    对于旧版的pycharm导入anaconda创建的虚拟环境及对应的python解释器 已经有很多解答 但是较新版本的pycharm引入anaconda的虚拟环境似乎有些不同 引入方式 第一步 进入settings 第二步 选择project
  • 企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

    功能模块 待办消息 招标公告 中标公告 信息发布 描述 全过程数字化采购管理 打造从供应商管理到采购招投标 采购合同 采购执行的全过程数字化管理 通供应商门户具备内外协同的能力 为外部供应商集中推送展示与其相关的所有采购业务信息 历史合作
  • 20.Python中Main 函数

    Python编程的术与道 Python语言进阶 视频课程 Python编程的术与道 Python语言进阶 视频课程链接 https edu csdn net course detail 28618 main函数 main函数就像程序的入口点
  • 腾讯云服务器安装宝塔面板教程(一键安装图文教程)建站准备

    腾讯云如何安装宝塔面板 腾讯云服务器安装宝塔面板图文教程 塔面板是一款服务器管理软件 用户可以通过Web端轻松管理服务器 提升运维效率 例如 创建管理网站 FTP 数据库 拥有可视化文件管理器 可视化软件管理器 可视化CPU 内存 流量监控
  • Vue3学习使用创建自定义指令

    简言 除了 Vue 内置的一系列指令 比如 v model 或 v show 之外 Vue 还允许你注册自定义的指令 Custom Directives 官网自定义指令 我们已经介绍了两种在 Vue 中重用代码的方式 组件和组合式函数 组件
  • 决策树和随机森林

    回归模型 1 信息熵 1 熵 2 联合熵 3 条件熵 4 互信息 2 决策树学习算法 1 决策树 2 决策树生成算法 3 信息增益 4 信息增益率 5 Gini系数 6 ID3算法举例 7 三种决策树学习算法 8 回归树 3 决策树的评价
  • c语言数组所含字节数,(C语言)数组所占字节怎么算?

    在C语言中 可以使用sizeof操作符来计算数组所占字节 sizeof操作符是专门用于检测类型或变量或数组在内存中所占有的空间 字节数 的 用它可以直接检测出数组在内存占有的字节数 C语言中有一个专门用于检测类型或变量或数组在内存中所占有的
  • c++之复杂类型作为unordered_map的键值

    unordered map unordered set 我们知道c 中有unordered map和unordered set这两个数据结构 其内部实现是哈希表 这就要求作为键值的类型必须是可哈希的 比如常见的数据类型int string等