QMap使用详解

2024-06-15 03:28
文章标签 使用 详解 qmap

本文主要是介绍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;
}

这篇关于QMap使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062298

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注