【Qt之QMap】介绍及示例

描述

QMap类是一个模板类,提供基于红黑树的字典功能。
QMap<Key, T>是Qt中的通用容器类之一。它存储(key, value)键值对,并提供快速查找与特定键相关联的值。
QMapQHash提供非常相似的功能。它们的区别在于:
QHash的查找速度平均比QMap更快。(有关详细信息,请参阅算法复杂度。)
当迭代QHash时,项目的排序是任意的。而使用QMap时,项目总是按键排序的。
QHash的键类型必须提供operator==()和一个全局qHash(Key)函数。QMap的键类型必须提供operator<()来指定一个全序。自Qt 5.8.1起,即使底层的operator<()没有提供全序,也可以安全地将指针类型用作键。
以下是一个使用QString类型键和int类型值的示例QMap

  QMap<QString, int> map;

要将(key, value)对插入到map中,可以使用operator :

  map["one"] = 1;map["three"] = 3;map["seven"] = 7;

这将把以下三个(key, value)对插入到QMap中:("one", 1), ("three", 3)和("seven", 7)。另一种插入项到map的方法是使用insert():

  map.insert("twelve", 12);

要查找一个值,可以使用operator或value():

  int num1 = map["thirteen"];num2 = map.value("thirteen");

如果在map中不存在指定的键,这些函数将返回一个默认构造的值。
如果想要检查map是否包含某个特定的键,可以使用contains():

  int timeout = 30;if (map.contains("TIMEOUT"))timeout = map.value("TIMEOUT");

还有一个value()重载,如果map中不存在指定的键,可以使用其第二个参数作为默认值:

  int timeout = map.value("TIMEOUT", 30);

一般来说,我们建议在map中查找键时使用contains()和value(),而不是operator。原因是operator如果没有具有相同键的项(除非map是const),会默默地向map中插入一个项。例如,下面的代码片段将在内存中创建1000个项:

  // 错误QMap<int, QWidget *> map;...for (int i = 0; i < 1000; ++i) {if (map[i] == okButton)cout << "Found button at index " << i << endl;}

为避免这个问题,在上面的代码中将map[i]替换为map.value(i)。
如果想要遍历存储在QMap中的所有(key, value)对,可以使用迭代器。QMap提供Java风格的迭代器(QMapIterator和QMutableMapIterator)和STL风格的迭代器(QMap::const_iterator和QMap::iterator)。以下是如何使用Java风格迭代器遍历QMap<QString, int>的示例:

  QMapIterator<QString, int> i(map);while (i.hasNext()) {i.next();cout << i.key() << ": " << i.value() << endl;}

这是相同的代码,但是这次使用STL风格的迭代器:

  QMap<QString, int>::const_iterator i = map.constBegin();while (i != map.constEnd()) {cout << i.key() << ": " << i.value() << endl;++i;}

项目按键的升序顺序遍历。
通常,QMap允许每个键只有一个值。如果您使用已经存在于QMap中键调用insert(),则先前的值将删除。例如:

  map.insert("plenty", 100);map.insert("enty", 2000);// map.value("plenty") == 2000

然而,您可以通过使用insertMulti()而不是insert()(或使用便利子类QMultiMap)来为每个键存储多个值如果要检索单个键的所有值,可以使用values(const Key &key),它返回一个QList:

  QList<int> values = map.values("plenty");for (int i = 0; i < values.size(); ++i)cout << values(i) << endl;

具有相同键的项从最近插入到最早插入可用。另一种方法是调用find()以获取具有键的第一个项的STL风格迭代器,并从那里进行迭代:

  QMap<QString, int>::iterator i = map.find("plenty");while (i != map.end() && i.key() == "plenty") {cout << i.value() << endl;++i;}

如果只需要从中提取值(而是键),还可以foreach:

  QMap<QString, int> map;...foreach (int value map)cout << value << endl;

可以通过多种方式从map中删除项。一种方法是调用remove();这将删除具有给定键的任何项。另一种方法是使用QMutableMapIterator::remove()此外,您可以使用clear()来清除整个map。
QMap的键和值数据类型必须是可赋值的数据类型。这涵盖了您可能遇到的大多数数据类型,但编译器不会让您以值的形式存储QWidget;反而,存储QWidget *。此外,QMap的键类型必须提供operator<()。QMap使用它来保持其项目排序,并假定如果x < y也没有y < x,则两个x和y相等。
示例:

  #ifndef EMPLOYEE_H#define EMPLOYEE_Hclass{public:Employee() {}Employee(const QString &name, const QDate &dateOfBirth);...private:QString myName;QDate myDateOfBirth;};inline bool operator<(const Employee &e1, const Employee &e2){if (e1.name() != e2.name())return e1.name() < e2.name();return e1.dateOfBirth() < e2.dateOfBirth();}#endif // EMPLOYEE_H

在示例中,首先比较员工的姓名如果它们相等,比较它的出生日期以打平局。

常用方法

下面是常用的QMap方法的介绍:

  • insert(key, value):将一个(key, value)对插入到map中。如果key已经存在于map中,则会覆盖原有的value。
  • insertMulti(key, value):将一个(key, value)对插入到map中,允许一个key对应多个value。可以通过values(key)方法获取所有与key对应的value列表。
  • remove(key):删除map中指定的key及其对应的value。
  • clear():清空map,移除其中的所有项。
  • contains(key):判断map中是否存在指定的key。
  • value(key, defaultValue):返回与指定的key关联的value。如果key不存在于map中,则返回默认值defaultValue。
  • count():返回map中键值对的数量。
  • keys():返回map中所有的键构成的列表。
  • values():返回map中所有的值构成的列表。
  • isEmpty():判断map是否为空,即是否不包含任何键值对。
  • size():返回map中键值对的数量。
  • begin() / constBegin():返回指向map中第一个键值对的迭代器。
  • end() / constEnd():返回指向map中最后一个键值对之后位置的迭代器。
  • find(key):查找map中第一个具有指定key的键值对,并返回指向该键值对的迭代器。
  • iterator / const_iterator:提供STL风格的迭代器,可以用于遍历map中的键值对。

erase()方法

QMaperase()方法用于从map中删除指定的键值对。用法如下:

  • erase(iterator):删除迭代器指向的键值对,并返回指向下一个键值对的迭代器。
    例如:
QMap<QString, int> map;
map.insert("key1", 10);
map.insert("key2", 20);QMap<QString, int>::iterator it = map.begin();
it = map.erase(it); // 删除迭代器指向的键值对,返回指向下一个键值对的迭代器
// 现在it指向键为"key2"的键值对

需要注意的是,当使用erase()方法删除元素后,迭代器会失效,如果还需要继续遍历map,应该使用返回的迭代器继续操作。

示例

#include <QMap>
#include <QString>
#include <QDebug>int main() {QMap<QString, int> map;// 添加键值对map.insert("One", 1);map.insert("Two", 2);map.insert("Three", 3);// 遍历并打印map中的键值对qDebug() << "Map content:";QMap<QString, int>::const_iterator iter;for (iter = map.constBegin(); iter != map.constEnd(); ++iter) {qDebug() << iter.key() << ":" << iter.value();}// 删除指定的键值对map.remove("Two");// 查找键为"Three"的键值对qDebug() << "Value of key 'Three':";if (map.contains("Three")) {qDebug() << map.value("Three");} else {qDebug() << "Key not found.";}// 获取所有键qDebug() << "All keys:";QList<QString> keys = map.keys();    foreach (const QString& key, keys) {qDebug() << key;}// 获取所有值qDebug() << "All values:";QList<int> values = map.values();    foreach (int value, values) {qDebug() << value;}return 0;
}

运行以上示例代码,输出结果如下:

Map content:
"One" : 1
"Two" : 2
"Three" : 3Value of key 'Three':
3All keys:
"One"
"Three"All values:
1
3

注意

        QMap<int, int*> map;QMap<int, int*>::iterator it = map.begin();while (it != map.end()) {map.erase(it);++it;}

以上使用QMap的erase()是错误的。
应改为:

        QMap<int, int*> map;map[1] = new int(1);map[2] = new int(2);map[3] = new int(3);QMap<int, int*>::iterator it = map.begin();while (it != map.end()) {// 接受返回值,进行循环it = map.erase(it);}

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

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

相关文章

macOS鼠标管理操作增强BetterMouse简体中文

BetterMouse是一款专为Mac用户设计的鼠标增强工具&#xff0c;旨在帮助用户更好地掌握和管理鼠标操作。它提供了全局鼠标手势、高度可定制的鼠标设置选项以及一些有用的鼠标增强功能&#xff0c;如鼠标放大镜、鼠标轨迹和应用程序切换功能。这些功能可以大大提高用户的工作效率…

HarmonyOS鸿蒙原生应用开发设计- 流转图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的流转图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的流转图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的图标侵权意外情况等&#xff0c;减…

基于机器视觉的火车票识别系统 计算机竞赛

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖&#xff0c;适合作为竞赛…

10.27 知识总结(前端)

一、 前端 1.1 什么是前端&#xff1f; 前端是所有跟用户直接打交道的都可以称之为是前端 比如&#xff1a;PC页面、手机页面、平板页面、汽车显示屏、大屏幕展示出来的都是前端内容 通俗点就是能够用肉眼看到的都是“前端” 1.2 为什么要学前端 学了前端以后我们就可以做全栈工…

浅谈数据结构之队列

队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它遵循“先进先出”&#xff08;First In, First Out&#xff0c;FIFO&#xff09;原则&#xff0c;即最先进队列的元素将最先被出队列。在本文中&#xff0c;我们将深入探讨队列的定义、Java实现方式、使用…

[蓝桥杯-610]分数

题面 解答 这一题如果不知道数论结论的话&#xff0c;做这个题会有两种天壤之别的体验 此题包含以下两个数论知识 1. 2^02^12^2...2^(n-1)2^n-1 2. 较大的数如果比较小的数的两倍大1或者小1&#xff0c;则两者互质 所以答案就是2^n-1/2^(n-1) 标程1 我的初次解答 #in…

【html】图片多矩形框裁剪

说明 由于项目中需要对一个图片进行多选择框进行裁剪&#xff0c;所以特写当前的示例代码。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><base href"/"><title>图片裁剪</tit…

【点云学习PCL 】一

点云学习 说明&#xff1a;仅做学习使用&#xff0c;侵删 参考网址1 一、点云基础 0 概述 PCL&#xff08;Point Cloud Library&#xff09;是用于 2D/3D 图像和点云处理的大型开源跨平台的 C 编程库&#xff0c;PCL 框架实现了大量点云相关的通用算法和高效的数据结构&…

基于XML的Web服务Java接口(JAX-WS)、Jakarta XML Web Services Eclipse 实现

简介 JAX-WS&#xff08;Java API for XML-Based Web Services&#xff09;&#xff0c;是创建web服务的Java编程接口&#xff0c;特别是SOAP服务。是Java XML编程接口之一&#xff0c;是Java SE 和Java EE 平台的一部分。 JAX-WS 2.0 规范是代替JAX-RPC 1.0的下一代Web服务AP…

YOLOv5 onnx \tensorrt 推理

一、yolov5 pt模型转onnx code: https://github.com/ultralytics/yolov5 python export.py --weights yolov5s.pt --include onnx二、onnx 推理 import os import cv2 import numpy as np import onnxruntime import timeCLASSES [person, bicycle, car, motorcycle, airpl…

stable diffusion简介和原理

Stable Diffusion中文的意思是稳定扩散&#xff0c;本质上是基于AI的图像扩散生成模型。 Stable Diffusion是一个引人注目的深度学习模型&#xff0c;它使用潜在扩散过程来生成图像&#xff0c;允许模型在生成图像时考虑到文本的描述。这个模型的出现引起了广泛的关注和讨论&am…

IP 地址查询,快速查询自己的 IP 地址

文章目录 在线结果 在线 http://myip.top/ 结果

【计算机网络笔记】Cookie技术

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

Redis(04)| 数据结构-压缩列表

压缩列表的最大特点&#xff0c;就是它被设计成一种内存紧凑型的数据结构&#xff0c;占用一块连续的内存空间&#xff0c;不仅可以利用 CPU 缓存&#xff0c;而且会针对不同长度的数据&#xff0c;进行相应编码&#xff0c;这种方法可以有效地节省内存开销。 但是&#xff0c;…

学习模板发布

学习目标&#xff1a; 提示&#xff1a;这里可以添加学习目标 例如&#xff1a; 一周掌握 Java 入门知识 学习内容&#xff1a; 提示&#xff1a;这里可以添加要学的内容 例如&#xff1a; 搭建 Java 开发环境掌握 Java 基本语法掌握条件语句掌握循环语句 学习时间&#x…

Python基础入门例程16-NP16 发送offer(列表)

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解答 &#xff1a; 说明&#xff1a; 描述 某公司在面试结束后&#xff0c;创建了一个依次包含字符串 Allen 和 Tom 的列表offer_list&#xff0c;作为通过面试的名单。 请你依次对列表中的名字发送类似 Allen, you…

腾讯云 AI 绘画:文生图、图生图、图审图 快速入门

腾讯云 AI 绘画是腾讯云推出的一款基于人工智能的图像生成和编辑产品&#xff0c;能够根据输入的图片或描述文本&#xff0c;智能生成与输入内容相关的图片&#xff0c;支持多样化的图片风格选择。 在本文中&#xff0c;我们将介绍如何使用腾讯云 AI 绘画的三项主要功能&#…

ORB-SLAM3算法1之Ubuntu18.04+ROS-melodic安装ORB-SLAM3及各种问题解决

文章目录 0 引言1 安装依赖1.1 opencv安装1.2 Eigen3安装1.3 Pangolin安装1.4 其他2 编译安装ORB-SLAM32.1 build.sh2.2 build_ros.sh0 引言 ORB-SLAM3,在之前ORB-SLAM和ORB-SLAM2的基础上,新增了IMU多传感器融合SLAM,这是第一个能够使用针孔和鱼眼镜头模型通过单目、立体和…

Windows-Oracle19c 安装详解-含Navicate远程连接配置 - 同时连接Oracle11g和Oracle19c

文章目录 0 说明1 下载链接2 安装&#xff1a;一定要以管理员身份运行&#xff0c;不然后面有可能会报错。3 启动监听4. 登录Oracle4 Navicate远程连接-配置监听4.1 修改监听文件4.2 网络配置助手-配置本地监听端口4.3 Navicate连接成功 5 Navicate同时连接两个Oracle数据库 0 …

鸿蒙ArkUI-X跨端应用开发,一套代码构建多平台应用

文章目录 一、项目介绍二、技术架构三、Gitee仓库地址四、ArkUI-X开发者文档五、快速开始——环境准备1、下载DevEco Studio&#xff0c;版本V4.0 Beta2以上2、打开DevEco&#xff0c;下载相关环境配置3、配置开发环境3.1、OpenHarmony SDK3.2、安装ArkUI-X SDK3.2、Android SD…