Qt笔记-自定义QSet,QHash的Key

news2024/9/22 8:26:53

官方文档已经说得很详细了。

If you want to use other types as the key, make sure that you provide operator==() and a qHash() implementation.

Example:
 #ifndef EMPLOYEE_H
 #define EMPLOYEE_H

 class Employee
 {
 public:
     Employee() {}
     Employee(const QString &name, const QDate &dateOfBirth);
     ...

 private:
     QString myName;
     QDate myDateOfBirth;
 };

 inline bool operator==(const Employee &e1, const Employee &e2)
 {
     return e1.name() == e2.name()
            && e1.dateOfBirth() == e2.dateOfBirth();
 }

 inline uint qHash(const Employee &key, uint seed)
 {
     return qHash(key.name(), seed) ^ key.dateOfBirth().day();
 }

 #endif // EMPLOYEE_H

In the example above, we've relied on Qt's global qHash(const QString &, uint) to give us a hash value for the employee's name, and XOR'ed this with the day they were born to help produce unique hashes for people with the same name.

在此我直接总结下,方便查阅。

构造2个内联函数,方便QHash去对比一个是operator == ,一个是qHash(const QString &, uint);

这里要注意2点:

①operator==:这里要注意,判断2个自定义对象是否相等,如果有唯一标识字段,比如主键,就可以直接用那个,如果没有,就在结构体中想想,拿些字段组合可以唯一标识这个结构体;

②qHash(const QString &, uint):生成hash的,同样要传入唯一标识的,上面的例子是用name生成的hash再和出生时间异或。并且const QString &, uint这个函数是Qt的全局函数(从搬砖的角度看意思就是不需要去包QHash的头文件了)。

下面是己的例子,我这个结构体是对应数据库的,id是唯一标识:

struct EncounterDB{
    int id;
    QString type;       //F = dead
    QString phase;

    friend QDebug operator << (QDebug os, EncounterDB record){

        os << "EncounterDB(" << record.id << "," << record.type << "," << record.phase << ")";
        return os;
    }
};

inline bool operator == (const AnswerDB &db1, const AnswerDB &db2){

    return db1.id == db2.id;
}

inline uint qHash(const AnswerDB &db, uint seed){

    return qHash(db.id, seed);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/697694.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Linux 中配置 IPv4 和 IPv6 地址详解

概要 IPv4和IPv6是Internet上常用的两种IP地址协议。在Linux系统中&#xff0c;您可以通过配置网络接口来设置IPv4和IPv6地址。本文将详细介绍如何在Linux中配置IPv4和IPv6地址。 步骤 1&#xff1a;确定网络接口 在开始配置IP地址之前&#xff0c;您需要确定要配置的网络接口…

CSDN竞赛第59期-参赛体验

CSDN竞赛第59期-参赛体验 前言介绍 体验收获反馈准备认可最后 前言 博主空空star主页空空star的主页 大家好&#xff0c;我是空空star&#xff0c;本篇给大家分享一下《CSDN竞赛第59期-参赛体验》。 介绍 CSDN竞赛 体验 我报名参加了CSDN举办的一场编程比赛&#xff0c;这是…

MacOS 升级golang版本后无法debug,升级delve版本

golang版本升级到1.20以后导致debug失效了&#xff0c;本文针对MacOS系统&#xff0c;win系统也可作参考。 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.4 (maximum supported version 1.19) 1、升级delve版本 brew install delve 安装…

重命名Github的默认分支名

- 最简单的办法是在github网站直接重命名&#xff0c;但是比较危险&#xff0c;因为有很多其他人已经把这个分支拉到本地了 - 另一个办法是基于当前的主分支&#xff0c;新建一个你要重命名的目标名字的分支 - git checkout 当前主分支名 - git checkout -b 目标主分支名 - git…

CentOS 挂载ntfs格式U盘

1、查看磁盘信息 fdisk -l 如上图所示&#xff0c;可以看到插入的U盘/dev/sdc 2、查看磁盘块信息 lsblk 如上图所示&#xff0c;sdc即是插入的U盘&#xff0c;sdc1为磁盘块&#xff0c;挂载的时候使用sdc1 3、查看磁盘文件系统类型 parted -l 如上图所示&#xff0c;U盘是WD…

分布式、服务化的ERP系统架构设计

ERP之痛 曾几何时&#xff0c;我混迹于电商、珠宝行业4年多&#xff0c;为这两个行业开发过两套大型业务系统&#xff08;ERP&#xff09;。作为一个ERP系统&#xff0c;系统主要功能模块无非是订单管理、商品管理、生产采购、仓库管理、物流管理、财务管理等等。作为一个管理系…

【数据结构】单链表(超全)

目录 一、什么是链表&#xff1f;1.1 定义1.2 链表的分类 二、无头单向非循环链表2.1 结构2.2 如何遍历链表数据2.3 尾插2.4 创建新节点2.5 头插2.6 尾删2.7 头删2.8 单链表查找2.9 在pos位置之前插入2.10 删除pos位置数据2.11 在pos位置的后面插入2.12 删除pos位置后面的数据 …

Markdown学习

我展示的是一级标题 我展示的是二级标题 斜体文本 斜体文本 粗体文本 粗体文本 粗斜体文本 粗斜体文本 第一项第二项第三项 第一项第二项第三项 第一项第二项第三项 第一项&#xff1a; 第一项嵌套的第一个元素第一项嵌套的第二个元素 第二项&#xff1a; 第二项嵌套的第…

mysql 常见锁类型

表锁 & 行锁 在 MySQL 中锁的种类有很多&#xff0c;但是最基本的还是表锁和行锁&#xff1a;表锁指的是对一整张表加锁&#xff0c;一般是 DDL 处理时使用&#xff0c;也可以自己在 SQL 中指定&#xff1b;而行锁指的是锁定某一行数据或某几行&#xff0c;或行和行之间的…

ROS2 lifecycle node生命周期节点 官方例程文档翻译

0 官方例程文档 ros2 humble lifecycle demo github repo 1 引言 ROS2引入了受管理节点的概念&#xff0c;受管理的节点又被称为是生命周期节点&#xff08;LifecycleNode&#xff09;。在接下来的教程中&#xff0c;我们会解释这些节点的作用&#xff0c;是什么使得它们和普…

【Linux 驱动篇(三)】新字符设备驱动

文章目录 一、新字符设备驱动原理1. 分配和释放设备号2. 新的字符设备注册方法2.1 字符设备结构2.2 cdev_init 函数2.3 cdev_add 函数2.4 cdev_del 函数 二、自动创建设备节点1. mdev 机制2. 创建和删除类3. 创建设备4. 参考示例5. 设置文件私有数据 三、LED 灯驱动程序编写四、…

Q-Learning 原理干货讲解

强化学习 本文是强化学习和Q-Learning算法的概念及原理 项目实战案例可查看下一篇文章&#xff1a;Q-Learning 单路径吃宝箱问题–棋盘格吃宝箱问题–拓扑节点较优路径问题 一. 强化学习概述 1.1 什么是强化学习 基于环境的反馈而行动&#xff0c;通过不断与环境的交互、试错&…

AR急诊急救大平台远程专家会诊方案

随着AR技术的完善&#xff0c;在医院急救中&#xff0c;需要及时把各方面专家汇在一起会诊&#xff0c;在AR这方面有数据采集清晰&#xff0c;资料呈现方便便捷&#xff0c;针对客户需要&#xff0c;我们对业务需求分析&#xff0c;比较市面多种产品&#xff0c;把会议&#xf…

Spring Boot 中的 @Cacheable 注解

Spring Boot 中的 Cacheable 注解 在 Spring Boot 中&#xff0c;缓存是一个非常重要的话题。当我们需要频繁读取一些数据时&#xff0c;为了提高性能&#xff0c;可以将这些数据缓存起来&#xff0c;避免每次都从数据库中读取。为了实现缓存&#xff0c;Spring Boot 提供了一…

Apikit 自学日记:发起文档测试-TCP/UDP

进入某个TCP/UDP协议的API文档详情页&#xff0c;点击文档上方 测试 标签&#xff0c;即可进入 API 测试页&#xff0c;系统会根据API文档的定义的求头部、Query参数、请求体自动生成测试界面并且填充测试数据。 填写/修改请求参数 1.1设置请求参数 与发起HTTP协议测试类似&am…

Django Vue corsheaders跨域问题

跨域问题 记录一下在我自己的django-vue项目里面出现的跨域问题 我的项目之前一直是在本地跑的&#xff0c;因为需要上线测试&#xff0c;所以我就运行在同一个vlan里面 ip段&#xff1a;192.168.1.0/24 突然发现存在跨域问题&#xff0c;我django的接口访问被拦截了。 检查…

Web服务器群集:Nginx+Tomcat实现负载均衡与动静分离集群

目录 一、理论 1.多实例 2.Nginx负载均衡 3.Nginx动静分离 4.配置NginxTomcat负载均衡 5.配置NginxTomcat动静分离集群 6.Nginx 四层代理配置 二、实验 1.配置NginxTomcat负载均衡 2.、配置NginxTomcat动静分离集群 三、问题 1.服务器群集与集群的区别 四、总结 一…

十分钟实现 Android Camera2 视频录制

1. 前言 因为工作中要使用Android Camera2 API&#xff0c;但因为Camera2比较复杂&#xff0c;网上资料也比较乱&#xff0c;有一定入门门槛&#xff0c;所以花了几天时间系统研究了下&#xff0c;并在CSDN上记录了下&#xff0c;希望能帮助到更多的小伙伴。 上两篇文章们使用…

Python主动抛出Warning的艺术:一种提醒用户的优雅方式

简介&#xff1a;Python提供了一个内置的warnings模块&#xff0c;使得开发者可以在代码中主动地发出警告。这对于告知用户某些问题或者对某些即将废弃的特性进行提示尤其有用。本文将重点介绍如何在Python代码中主动抛出警告&#xff0c;并探讨其使用场景和优势。 历史攻略&a…

设计模式3:单例模式:volatile关键字能不能解决多线程计数问题?

先说结论不能&#xff1a; 代码实测下&#xff1a; public class Counter {public volatile static int count 0;public static void inc() {//这里延迟1毫秒&#xff0c;使得结果明显try {Thread.sleep(1);} catch (InterruptedException e) {}count;}public static void ma…