QMap使用详解

QMap使用详解

  • 1. 实例化 `QMap` 对象
  • 2. 插入数据
  • 3. 移除数据
  • 4. 遍历数据
  • 5. 由键查找对应键值
  • 6. 由键值查找键
  • 7. 修改键值
  • 8. 查找是否包含某个键
  • 9. 获取所有的键和键值
  • 10.清除数据
  • 11.一个键对应多个值
  • 12.QMultiMap 遍历数据
  • 13.完整示例代码
  • 14.使用自定义键类型的 `QMap`
    • 示例:使用自定义键类型的 `QMap`
      • 步骤 1:定义自定义键类型
      • 步骤 2:将自定义键类型用于 `QMap`

QMap 是 Qt 提供的一个模板类,用于存储键值对。默认情况下, QMap 可以使用基本数据类型或 Qt 的基本类型(如 QString, int, QDate 等)作为键。但是,如果你需要使用自定义类型作为键,则需要满足一些特定的条件。

以下是使用自定义键开发 QMap 的详解:

1. 实例化 QMap 对象

QMap<int, QString> map;

2. 插入数据

map.insert(1, "One");
map.insert(2, "Two");
map.insert(3, "Three");

3. 移除数据

map.remove(2); // 移除键为 2 的项

4. 遍历数据

for (auto it = map.begin(); it != map.end(); ++it) {qDebug() << "Key:" << it.key() << "Value:" << it.value();
}

5. 由键查找对应键值

if (map.contains(1)) {QString value = map.value(1);qDebug() << "Value for key 1:" << value;
}

6. 由键值查找键

QMap 本身没有直接提供由键值查找键的功能,但可以通过遍历来实现:

int key = -1;
QString targetValue = "Three";
for (auto it = map.begin(); it != map.end(); ++it) {if (it.value() == targetValue) {key = it.key();break;}
}
qDebug() << "Key for value 'Three':" << key;

7. 修改键值

map[1] = "Uno";

8. 查找是否包含某个键

bool containsKey = map.contains(1);
qDebug() << "Contains key 1:" << containsKey;

9. 获取所有的键和键值

QList<int> keys = map.keys();
QList<QString> values = map.values();qDebug() << "Keys:" << keys;
qDebug() << "Values:" << values;

10.清除数据

map.clear();

11.一个键对应多个值

对于一个键对应多个值的需求,可以使用 QMultiMap

QMultiMap<int, QString> multiMap;
multiMap.insert(1, "One");
multiMap.insert(1, "Uno");
multiMap.insert(2, "Two");// 遍历 QMultiMap 数据
for (auto it = multiMap.begin(); it != multiMap.end(); ++it) {qDebug() << "Key:" << it.key() << "Value:" << it.value();
}// 获取所有值为某键的列表
QList<QString> valuesForKey = multiMap.values(1);
qDebug() << "Values for key 1:" << valuesForKey;

12.QMultiMap 遍历数据

for (auto it = multiMap.begin(); it != multiMap.end(); ++it) {qDebug() << "Key:" << it.key() << "Value:" << it.value();
}

13.完整示例代码

以下是一个完整的例子,将上述所有操作整合在一起:

#include <QCoreApplication>
#include <QMap>
#include <QMultiMap>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 实例化 QMap 对象QMap<int, QString> map;// 插入数据map.insert(1, "One");map.insert(2, "Two");map.insert(3, "Three");// 移除数据map.remove(2); // 移除键为 2 的项// 遍历数据for (auto it = map.begin(); it != map.end(); ++it) {qDebug() << "Key:" << it.key() << "Value:" << it.value();}// 由键查找对应键值if (map.contains(1)) {QString value = map.value(1);qDebug() << "Value for key 1:" << value;}// 由键值查找键int key = -1;QString targetValue = "Three";for (auto it = map.begin(); it != map.end(); ++it) {if (it.value() == targetValue) {key = it.key();break;}}qDebug() << "Key for value 'Three':" << key;// 修改键值map[1] = "Uno";// 查找是否包含某个键bool containsKey = map.contains(1);qDebug() << "Contains key 1:" << containsKey;// 获取所有的键和键值QList<int> keys = map.keys();QList<QString> values = map.values();qDebug() << "Keys:" << keys;qDebug() << "Values:" << values;// 清除数据map.clear();// 一个键对应多个值QMultiMap<int, QString> multiMap;multiMap.insert(1, "One");multiMap.insert(1, "Uno");multiMap.insert(2, "Two");// 遍历 QMultiMap 数据for (auto it = multiMap.begin(); it != multiMap.end(); ++it) {qDebug() << "Key:" << it.key() << "Value:" << it.value();}// 获取所有值为某键的列表QList<QString> valuesForKey = multiMap.values(1);qDebug() << "Values for key 1:" << valuesForKey;return a.exec();
}

这段代码展示了如何实例化 QMapQMultiMap 对象,插入、移除、遍历数据,查找键和值,修改键值,清除数据,并处理一个键对应多个值的情况。

14.使用自定义键类型的 QMap

  1. 自定义键类型需要实现以下操作符:

    • == 运算符:用于比较两个键是否相等。
    • < 运算符:用于比较两个键的大小。QMap 内部使用此操作符来保持元素的顺序。
  2. 自定义键类型需要支持复制和赋值。

示例:使用自定义键类型的 QMap

假设你有一个自定义类型 Person,包含 firstNamelastName 字段,你希望将 Person 作为 QMap 的键。

步骤 1:定义自定义键类型

#include <QString>
#include <QDebug>class Person {
public:QString firstName;QString lastName;Person() {}Person(const QString &first, const QString &last) : firstName(first), lastName(last) {}bool operator==(const Person &other) const {return firstName == other.firstName && lastName == other.lastName;}bool operator<(const Person &other) const {if (lastName == other.lastName) {return firstName < other.firstName;}return lastName < other.lastName;}
};inline uint qHash(const Person &key, uint seed) {return qHash(key.firstName, seed) ^ qHash(key.lastName, seed);
}

步骤 2:将自定义键类型用于 QMap

#include <QMap>
#include <QDebug>int main() {QMap<Person, int> peopleMap;// 添加元素到 QMappeopleMap.insert(Person("John", "Doe"), 30);peopleMap.insert(Person("Jane", "Doe"), 25);peopleMap.insert(Person("Alice", "Smith"), 28);// 遍历 QMapfor (auto it = peopleMap.begin(); it != peopleMap.end(); ++it) {qDebug() << it.key().firstName << it.key().lastName << ":" << it.value();}return 0;
}

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

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

相关文章

大模型出现的不断重复的现象

无论是大语言模型还是多模态模型,都遇到过这个问题,该如何解决呢? 1.调整推理参数 [BUG] 返回重复的内容 Issue #277 QwenLM/Qwen GitHub是否已有关于该错误的issue或讨论? | Is there an existing issue / discussion for this? 我已经搜索过已有的issues和讨论 | I…

【Linux】基础IO——系统文件IO

我之前是讲过c语言的文件操作的&#xff0c;但是说实话我压根就不知道它在干什么&#xff0c;后面c语言/c,数据结构的学习过程中也没用过文件操作&#xff0c;今天我们就来会会这个文件操作 1.回顾c语言文件接口 1.1.fopen r &#xff1a;只读模式打开&#xff0c;文件流指针…

Java程序员英语单词通关:

Java程序员英语单词通关&#xff1a; abstract - 抽象的 boolean - 布尔值 break - 打断 byte - 字节 case - 情况&#xff0c;实例 catch - 捕获 char - 字符 class - 类 continue - 继续 default - 默认&#xff0c;通常 do - 做&#xff0c;运行 double - 双精度…

【LeetCode 92.】 反转链表 II

1.题目 虽然本题很好拆解&#xff0c;但是实现起来还是有一些难度的。 2. 分析 尽可能抽象问题&#xff0c;然后简化代码 我在写本题的时候&#xff0c;遇到了下面这两个问题&#xff1a; 没有把[left,right] 这个区间的链表给断开&#xff0c;所以导致反转起来非常麻烦。…

【iOS】KVO相关总结

目录 1. 什么是KVO&#xff1f;2. KVO的基本使用3. KVO的进阶使用observationInfo属性context 的使用KVO触发监听方法的方式自动触发手动触发 KVO新旧值相等时不触发KVO的从属关系一对一关系一对多关系 4. KVO使用注意5. KVO本质原理分析伪代码保留伪代码下的类并编译运行对比添…

JVM垃圾回收的普遍步骤

JVM&#xff08;Java Virtual Machine&#xff09;进行垃圾回收时&#xff0c;通常遵循以下步骤。不同的垃圾收集器可能会有一些不同的实现细节&#xff0c;但基本步骤和思想大致相同。以下是一般的垃圾回收过程的主要步骤&#xff1a; 1. 标记阶段&#xff08;Marking Phase&…

小白都能看懂的 “栈”

什么是栈&#xff1f;首先引用维基百科的解释&#xff1a; 栈&#xff08;stack&#xff09;是计算机科学中的一种抽象资料类型&#xff0c;只允许在有序的线性资料集合的一端&#xff08;称为堆栈顶端&#xff0c;top&#xff09;进行加入数据&#xff08;push&#xff09;和移…

Go语言结构体内嵌接口

前言 在golang中&#xff0c;结构体内嵌结构体&#xff0c;接口内嵌接口都很常见&#xff0c;但是结构体内嵌接口很少见。它是做什么用的呢&#xff1f; 当我们需要重写实现了某个接口的结构体的(该接口)的部分方法&#xff0c;可以使用结构体内嵌接口。 作用 继承赋值给接口…

信号与系统实验MATLAB-实验1-信号的MATLAB表示及信号运算

实验1-信号的MATLAB表示及信号运算 一、实验目的 1、掌握MATLAB的使用&#xff1b; 2、掌握MATLAB生成信号波形&#xff1b; 3、掌握MATLAB分析常用连续信号&#xff1b; 4、掌握信号运算的MATLAB实现。 二、实验内容 编写程序实现下列常用函数&#xff0c;并显示波形。…

PyTorch -- Visdom 快速实践

安装&#xff1a;pip install visdom 注&#xff1a;如果安装后启动报错可能是 visdom 版本选择问题 启动&#xff1a;python -m visdom.server 之后打开出现的链接 http://localhost:8097Checking for scripts. Its Alive! INFO:root:Application Started INFO:root:Working…

数据网格和视图入门

WinForms数据网格&#xff08;GridControl类&#xff09;是一个数据感知控件&#xff0c;可以以各种格式&#xff08;视图&#xff09;显示数据。本主题包含以下部分&#xff0c;这些部分将指导您如何使用网格控件及其视图和列&#xff08;字段&#xff09;。 Grid Control’s…

BUUCTF-Web题目1

目录 [HCTF 2018]admin 1、题目 2、知识点 3、思路 [极客大挑战 2019]BuyFlag 1、题目 2、知识点 3、思路 [HCTF 2018]admin 1、题目 2、知识点 BP暴力破解密码 3、思路 打开题目&#xff0c;查看页面源代码&#xff0c;发现需要admin用户才可以登录 这一台有很多解法…

redis清空list

redis list清空 要清空Redis中的list&#xff0c;您可以使用LTRIM命令。Redis Ltrim 对一个列表进行修剪(trim)&#xff0c;就是说&#xff0c;让列表只保留指定区间内的元素&#xff0c;不在指定区间之内的元素都将被删除。 下标 0 表示列表的第一个元素&#xff0c;以 1 表示…

LeetCode | 20.有效的括号

这道题就是栈这种数据结构的应用&#xff0c;当我们遇到左括号的时候&#xff0c;比如{,(,[&#xff0c;就压栈&#xff0c;当遇到右括号的时候&#xff0c;比如},),]&#xff0c;就把栈顶元素弹出&#xff0c;如果不匹配&#xff0c;则返回False&#xff0c;当遍历完所有元素后…

实体店如何通过私域获取流量?

随着互联网的快速发展和消费者购物习惯的变化&#xff0c;私域流量对于实体店的重要性日益凸显。私域流量是指企业在自己的平台上沉淀的、可以免费使用、多次利用的流量&#xff0c;如微信生态下的朋友圈、公众号、企业微信等。对于实体店而言&#xff0c;有效利用私域流量不仅…

K8s 卷快照类

卷快照类 卷快照类 这个警告信息通常出现在使用 kubectl 删除 Kubernetes 集群资源时&#xff0c;如果尝试删除的是集群作用域&#xff08;cluster-scoped&#xff09;的资源&#xff0c;但指定了命名空间&#xff08;namespace&#xff09;&#xff0c;就会出现这个警告。 集…

基于PointNet / PointNet++深度学习模型的激光点云语义分割

一、场景要素语义分割部分的文献阅读笔记 1.1 PointNet PointNet网络模型开创性地实现了直接将点云数据作为输入的高效深度学习方法&#xff08;端到端学习&#xff09;。最大池化层、全局信息聚合结构以及联合对齐结构是该网络模型的三大关键模块&#xff0c;最大池化层解决了…

72、AndroidStudio 导入项目Connect timed out错误解决

一、背景&#xff1a; 开发过程中难免会 clone 其他的项目&#xff0c;clone 或者下载成功之后。使用 android studio 打开项目时经常遇到 Connect timed out错误如图所示&#xff1a; 二、分析原因&#xff1a; 1、既然链接超时&#xff0c;肯定是 android studio 在运行…

包装类的应用

一.什么是包装类 基本数据类型所对应的引用数据类型 二.集合中不能存储基本数据类型 三.JDK5以后对包装类新增了什么特性&#xff1f; // 自动装箱:把基本数据类型会自动的变成对应的包装类 // 自动拆箱:把包装类自动的变成其对象的基本数据类型 四.我们以后如何获取包…

02-MybatisPlus批量插入性能够吗?

1 前言 “不要用 mybatis-plus 的批量插入&#xff0c;它其实也是遍历插入&#xff0c;性能很差的”。真的吗&#xff1f;他们的立场如下&#xff1a; 遍历插入&#xff0c;反复创建。这是一个重量级操作&#xff0c;所以性能差。这里不用看源码也知道&#xff0c;因为这个和…