[QT] QMap使用详解

引言

​ QMap/QMultiMap属于关联式容器,其底层结构是通过二叉树实现,故其查找value的效率很快。QMap中的数据都是成对出现的,第一个称为key(键),第二个称value(键值)。

目录

  1. 实例化QMap对象
  2. 插入数据
  3. 移除数据
  4. 遍历数据
  5. 由键查找对应键值
  6. 由键值查找键
  7. 修改键值
  8. 查找是否包含某个键
  9. 获取所有的键和键值
  10. 清楚数据
  11. 一个键对应多个值
  12. QMultiMap遍历数据

实例化QMap对象

    /* 创建QMap实例, 第一个参数为QString类型的键,第二个参数为int类型的值 */QMap<QString, int> map;

插入数据

    /* 插入数据 两种方式*/map["math"] = 100; map.insert("English", 99); /* 推荐 */

打印输出: QMap((“English”, 99)(“math”, 100))

移除数据

    /* 移除数据 */map.remove("math");

打印输出:QMap((“English”, 99))

遍历数据

    /* 遍历数据 (先随便插入几个)*/map.insert("Math", 100);map.insert("Chinese", 98);map.insert("physical", 97);map.insert("chemical", 96);map.insert("biological", 95);/* 遍历数据要使用迭代器,QT提供了两种方式的迭代 *//* 第一种是Java类型的迭代 */QMapIterator<QString, int> iterator(map);while (iterator.hasNext()) {iterator.next();qDebug() << iterator.key() << ":" << iterator.value();}/* 第二种是STL类型的迭代 */QMap<QString, int>::const_iterator iterator_1 = map.constBegin();while (iterator_1 != map.constEnd()) {qDebug() << iterator_1.key() << ":" << iterator_1.value();++iterator_1;}/* 或 */for (QMap<QString, int>::const_iterator it = map.constBegin(); it != map.constEnd(); it++) {qDebug() << it.key() << ": " << it.value();}

打印输出:两种方法输出一样
“Chinese” : 98
“English” : 99
“Math” : 100
“biological” : 95
“chemical” : 96
“physical” : 97

由键查找对应键值

map.value("Math");

打印输出:100

由键值查找键

QString k = map.key(100);
qDebug() << k;

打印输出:“Math”

修改键值

    /* 通常一个键只对应一个值,如果再次调用insert()方法,会覆盖以前的值 */map.insert("Math", 120);qDebug() << map.value("Math");

打印输出:120

查找是否包含某个键

    bool isok = map.contains("Math");qDebug() << isok;

打印输出:true

获取所有的键和键值

    QList<QString> allKeys = map.keys();qDebug() << allKeys;QList<int> allValues = map.values();qDebug() << allValues;

打印输出:
(“Chinese”, “English”, “Math”, “biological”, “chemical”, “physical”)
(98, 99, 120, 95, 96, 97)

清除数据

    map.clear();qDebug() << map.isEmpty();

打印输出:true

一个键对应多个值

方式一:通过insertMulti方法

    /* 通过insert方法进行插值会覆盖以前的值,但是通过insertMulti方法不会覆盖,而是会增加一对 */map.insert("Math", 100);map.insertMulti("Math", 150);qDebug() << map.value("Math");qDebug() << map.values("Math");/* 获取Math所有键值 *//* 查看当前键和键值的数量 */qDebug() << map.keys().size();qDebug() << map.values().size();

打印输出:150
(150, 100)
2\color{#FF0000}{2}2
2

总结:通过insertMulti方法可以使得一个键对应多个键值,通过value获取其最后一次插入得键值,通过values获取其所有键值。

注意:这一点与STL中得map不同,在STL中,map对象是不允许有多个相同键的

/* 这是STL测试用例 */
#include <iostream>
#include <map>
#include <string>using namespace std;
int main()
{map<string, int> mp;mp.insert(pair<string, int>("Math", 100));/* 再次插入一个键为"Math"的map */mp.insert(make_pair("Math",120));for(map<string, int>::iterator it = mp.begin(); it != mp.end(); it++){cout << "key = " << it->first << " value: " << it->second << endl;}return 0;
}

打印输出:key = Math value: 100

虽然插入了两次,但是因为都是同一个键,故第二次插入无效。

方式二:通过QMultiMap类

    map.insert("Math", 100);map.insertMulti("Math", 150);map.insertMulti("Math", 120);qDebug() << map.values("Math");QMultiMap<QString, int> multiMap;multiMap.insert("Math", 100);multiMap.insert("Math", 90);multiMap.insert("Math", 80);qDebug() << multiMap.values("Math");

打印输出:

(120, 150, 100)
(80, 90, 100)

两种方法效果是一样的。

QMultiMap遍历数据

    /* 遍历全部 */
for (QMultiMap<QString, int>::iterator it = multiMap.begin(); it != multiMap.end(); it++) {qDebug() << it.key() << ": " << it.value();
}/* 只遍历指定键 */
for (QMultiMap<QString, int>::iterator it = multiMap.find("Math"); it != multiMap.end(); it++) {qDebug() << it.key() << ": " << it.value();
}

[QT] QMap使用详解相关推荐

  1. QT QtableView操作详解

    本文实现了使用QtableView控件来显示数据,数据源使用txt文本作为数据源,使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化,和对txt数据源的增删 ...

  2. Qt pro 文件详解

     Qt pro 文件详解 1. TEMPLATE  变量TEMPLATE描述了为建立目标文件而采用何种模板,即生成何种形式的Makefile文件.Qmake  工具定义了5种模板:   a. 应用 ...

  3. Qt 5.12--Item详解

    Qt 5.12--Item详解 1 作为容器 2 默认属性 3 透明度 4 堆叠顺序 5 定位子项目和坐标映射 参考 QML中的所有可视项目都继承自Item.虽然Item本身没有可视化的外观,但是它定 ...

  4. qstring如何初始化_学习QT之QString详解

    学习QT之QString详解 QString类保存16位Unicode值,提供了丰富的操作.查询和转换函数.该类还进行了使用隐式共享.高效的内存分配策略等多方面的优化. 一.字符串常用操作 字符串的操 ...

  5. QT Echarts 使用详解(一)ECharts下载\示例\动态缩放

    Echarts是百度的一款可视化界面开发的平台,里面的地图以及数据可视化内容十分丰富,适合用于一些大屏数据显示项目或者一些ui界面开发.每一个ECharts图表使用一个无边框的QWebView来展示, ...

  6. Qt之QMessageBox详解

    直接上官方文档 //提示型 static StandardButton information(QWidget *parent, const QString &title,const QStr ...

  7. rv1109/rv1126 编译并部署QT项目(详解)

    目录 前言 一.Windows 下QT环境搭建 二.在 Builroot 下编译QT应用 1.Buildroot下构建QT工程 2.移植源码 3.编译工程 三.使用交叉编译工具链编译QT 1.准备工作 ...

  8. QT QLineEdit使用详解

    本文详细的介绍了QLineEdit控件的各种操作,例如:编辑框的状态.边框.密码框.限制输入类型.对齐方式.验证器的使用.样式表的应用等操作. QLineEdit允许用户输入和编辑单行纯文本,提供了很 ...

  9. QT之QTimer详解以及结合多线程中开启定时器的示例

    一 QTimer详解 QTimer类提供了重复和单次触发信号的定时器. a.void timeout ()定时器超时后,这个信号被发射. b.void start()开启定时器,它的重载函数void ...

最新文章

  1. 干货丨达沃斯群英纵论人工智能,核心观点汇总
  2. 重没想过好好走下去----我的IT成长路
  3. Java 8中HashMap冲突解决
  4. 五.Java IO、NIO、文件、通讯
  5. Android--面试题整理(二)
  6. 中职学校计算机专业的论文,中职计算机论文范文2篇
  7. 为什么软件测试需要变革?
  8. 云服务器 ECS > 块存储 > 块存储介绍 > 块存储概述 请输入关键词
  9. php大作业含代码_目标检测 | 目标检测技巧大汇总(含代码与解读)
  10. 中国水性植绒胶行业市场供需与战略研究报告
  11. c语言编程贪吃蛇的不同功能,贪吃蛇C语言代码实现(难度可选)
  12. K3 CLOUD库存管理关账与存货核算关账区别
  13. 《论文写作》课程收获
  14. ZJNU——1695(分栗子)
  15. Python实现头像换脸(AI换脸)
  16. 改进型脉振高频注入源码 stm32工程 脉振高频注入是一种通过在d轴注入正弦电压
  17. 图书管理系统java课设_JavaGUI图书管理系统(可作课程设计)
  18. 新科技巡礼:2017十大前沿科技产品有哪些?
  19. 【分层实验框架】阿里妈妈大规模在线分层实验实践
  20. 第1章 计算机系统漫游

热门文章

  1. 锁定计算机禁用,“关闭计算机锁定”的解决方案
  2. 值得程序猿收藏的这些顶级技术网站,你都知道几个?
  3. 二叉树:填充每个节点的下一个右侧节点指针(java)
  4. CF625E Frog Fights
  5. 美团技术年货:1300+页电子书,覆盖前端、后台、数据、算法、顶会论文……...
  6. 使用谷歌headless(puppeteer)解决SEO问题
  7. 支付宝APP支付回调问题
  8. Struts2 Action 与Spring bean 作用域
  9. ResNet(残差网络模型)原理解读-包括residual block与BN原理介绍
  10. Python之爬虫-- Requests