当前位置: 首页 > news >正文

Qt中数据结构使用自定义类————附带详细示例

文章目录

  • C++对数据结构使用自定义类
    • 1 QMap使用自定义类
      • 1.1 使用自定义类做key
      • 1.2 使用自定义类做value
    • 2 QSet使用自定义类
  • 参考

C++对数据结构使用自定义类

1 QMap使用自定义类

1.1 使用自定义类做key

QMap<key,value>中数据存入时会对存入key值的数据进行比较,并按照比较后的顺序进行排序存储,因此需要重载运算符函数<

实例如下:

struct Animal{Animal(int size, int area):m_size(size),m_area(area){}~Animal(){}//重载运算符函数bool operator<(const Animal &a) const //注意这里的两个const{if(m_size == a.m_size){return m_area > a.m_area;}else{return m_size > a.m_size;}}int m_size;int m_area;};
QMap<Animal, int> g_AnimalTypeHash;int main(int argc, char *argv[])
{QApplication a(argc, argv);Animal tmpA1 = Animal(20, 1);g_AnimalTypeHash[tmpA1] = 2;return a.exec();
}

1.2 使用自定义类做value

QMap<key,value>中,当自定义类为value,每当赋值时,都会用到默认构造函数、拷贝构造、赋值运算符函数。如果没有重写构造函数,则编译器会帮忙编写上面的函数。

实例如下:

struct Animal{int m_size;int m_area;};QMap<int, Animal> g_AnimalTypeHash2;
int main(int argc, char *argv[])
{QApplication a(argc, argv);Animal tmpB1;tmpB1.m_size = 1;tmpB1.m_area = 2;g_AnimalTypeHash2[2] = tmpB1;return a.exec();
}

如果自己重写了构造函数,则需要重新编写拷贝构造、赋值运算符、析构函数。

实例如下:

struct Animal{Animal(){}Animal(int size, int area):m_size(size),m_area(area){}~Animal(){}Animal(const Animal& a){//拷贝构造this->m_size = a.m_size;this->m_area = a.m_area;qDebug()<<"拷贝构造";}Animal& operator =(const Animal& a) //赋值运算符{if (this != &a){this->m_size = a.m_size;this->m_area = a.m_area;}qDebug()<<"赋值运算符";return *this;}int m_size;int m_area;};QMap<int, Animal> g_AnimalTypeHash2;int main(int argc, char *argv[])
{QApplication a(argc, argv);Animal tmpA1 = Animal(20, 1);g_AnimalTypeHash2[2] = tmpA1;return a.exec();
}

2 QSet使用自定义类

使用自定义类做映射类型,必须重写赋值==运算符函数和编写全局的qHash函数,因为QSet是基于QHash实现的(哈希表)。而且QHash存储的必须是值,不能是指针类型。

以下为官方解释:

在这里插入图片描述

错误的例子:

struct Animal{bool operator<(const Animal &a) const //注意这里的两个const{if(m_size == a.m_size){return m_area > a.m_area;}else{return m_size > a.m_size;}}int m_size;int m_area;};int main(int argc, char *argv[])
{QApplication a(argc, argv);QSet<Animal> animalsSet;Animal animal;for(int i = 0;i < 10;i++){animal.m_size = i;animal.m_area = i*i;animalsSet.insert(animal);}return a.exec();
}    

编译器会爆出如下的错误:

1,error: no matching function for call to 'qHash(const Animal&)' ,;

2,error: no match for 'operator==' (operand types are 'const Animal' and 'const Animal');

正确的示例如下:

struct Animal{bool operator==(const Animal &a) const{if(m_size == a.m_size){return m_area > a.m_area;}else{return m_size  > a.m_size;}}int m_size;int m_area;};uint qHash(const Animal& a)
{return a.m_area + a.m_size;
}int main(int argc, char *argv[])
{QApplication a(argc, argv);QSet<Animal> animalsSet;Animal animal;for(int i = 0;i < 10;i++){animal.m_size = i;animal.m_area = i*i;animalsSet.insert(animal);}return a.exec();
}

参考

QSet Class
用QSet存储一个自定义结构体

http://www.dtcms.com/a/171928.html

相关文章:

  • kotlin 01flow-StateFlow 完整教程
  • 使用OpenCV 和 Dlib 进行卷积神经网络人脸检测
  • ASP.NET Core 请求限速的ActionFilter
  • 在Window10 和 Ubuntu 24.04LTS 上 Ollama 在线或离线安装部署
  • 【ArUco boards】标定板检测
  • 详解RabbitMQ工作模式之路由模式
  • 适配器模式
  • 《 C++ 点滴漫谈: 三十六 》lambda表达式
  • Kotlin中 StateFlow 或 SharedFlow 或 LiveData的区别
  • 算力经济模型推演:从中心化到去中心化算力市场的转变(区块链+智能合约的算力交易原型设计)
  • Level DB --- MergingIterator
  • 数据结构之二叉树(4)
  • 【AI大模型】SpringBoot整合Spring AI 核心组件使用详解
  • PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比
  • C++负载均衡远程调用学习之负载均衡算法与实现
  • 从零开始学习RAG
  • 《算法导论(第4版)》阅读笔记:p7-p8
  • FISCO BCOS【初体验笔记】
  • 嵌入式学习笔记 - STM32 SRAM控制器FSMC
  • RocketMQ与Kafka的区别
  • Nginx正反向代理与正则表达式
  • 从OpenMP中的不兼容,窥探AI应用开发中的并行编程
  • GStreamer开发笔记(三):测试gstreamer/v4l2+sdl2/v4l2+QtOpengl打摄像头延迟和内存
  • 《深入理解 Java 虚拟机》笔记
  • 手表关于MPU6050中的功能实现
  • 架构思维:构建高并发读服务_基于流量回放实现读服务的自动化测试回归方案
  • Kubernetes控制平面组件:Controller Manager 之 NamespaceController 全方位讲解
  • 基于windows安装MySQL8.0.40
  • Dubbo(97)如何在物联网系统中应用Dubbo?
  • 【PDF拆分+提取内容改名】批量拆分PDF提取拆分后的每个PDF物流面单数据改名或导出表格,基于WPF的PDF物流面单批量处理方案