当前位置: 首页 > 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存储一个自定义结构体

相关文章:

  • 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的区别
  • 习近平致电祝贺默茨当选德国联邦总理
  • 山东滕州市醉驾交通事故肇事人员已被刑拘
  • 青岛双星名人集团董事长发公开信称家人逼迫交出管理权?公司回应
  • “两高”出台司法解释,严打破坏黑土地资源犯罪
  • 超导电路新设计有望提升量子处理器速度
  • 新质观察|“模速空间”如何成为“模范空间”