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

目录
实例化QMap对象
插入数据
移除数据
遍历数据
由键查找对应键值
由键值查找键
修改键值
查找是否包含某个键
获取所有的键和键值
清楚数据
一个键对应多个值
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();
}

/****************************************************************************

1——创建,里面的数据类型随意都行

QMap<QString,QByteArray> m_qMap;
2——插入赋值,QMap只允许每个键有一个值。如果使用QMap中已存在的键调用Insert(),则先前的值将被擦除。

//方式一
     m_qMap["one"] = "1";
     m_qMap["three"] = "2";
     m_qMap["seven"] = "3";
 
     //方式二
     m_qMap.insert("twelve", 12);
3——取值,如果指定的键不在映射中,会返回默认值,比如QString-int的则返回0,QString-QByteArray的则返回空值“”。

//方式1
     QByteArray num1 = m_qMap["thirteen"];//num1 = 3;
 
     //方式2
     QByteArray num2 = m_qMap.value("one");//num2 = 1;
4——检查映射是否包含某个键

if(m_qMap.contains("one"))
    {
        return true;
    }
 
    if(m_qMap.contains("qwe")
    {
        return false;
    }
5——遍历

//方法一:
    QMap<QString, QByteArray>::const_iterator it = m_qMap.constBegin();
    while (it != m_qMap.constEnd())
    {
         cout << it.key() << ": " << it.value() << endl;
         ++it;
    }
方法二:2022/7/19发现了个遍历的好方法,一直觉得用迭代器太烦了,反正我不是很喜欢

QList<QString> keyList = resMap.keys();//存放的就是QMap的key值
    for(int i=0;i<keyList.size();i++)
    {
        //这里知道了key不管是删除还是查找还是啥啥啥都很方便
    }
6——删除,成功返回1,但如果键不在映射中,则返回0

//方式1    
    int i = m_qMap.remove("one");//i=1;
    int b = m_qMap.remove("trg");//b=0;
 
    //方式2 
    it=m_qMap.find("one");
    m_qMap.erase(it);//it是迭代器
QHash的使用(插入、取值、遍历、删除)

QT中QMap使用实例详解相关推荐

  1. java中匿名内部类详解_java 中匿名内部类的实例详解

    搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...

  2. java list 移除_java 中List删除实例详解

    java 中List删除实例详解 1.循环删除List中的元素 public static void main(String[] args) { List t=new ArrayList(); for ...

  3. java 控制jsp_JSP学习之Java Web中的安全控制实例详解

    普通用户界面 修改登录的Servlet,修改后的代码如下: LoginProcess.java代码: package servlet; import javabean.User; import jav ...

  4. java list 重复数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个List集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  5. file java详解_Java中File的实例详解

    Java中File的实例详解 File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(Stri ...

  6. java 找出重复的数据_java 查找list中重复数据实例详解

    java 查找list中重复数据实例详解 需求: 查找一个list集合中所有重复的数据,重复的数据可能不止一堆,比如:aa, bb, aa, bb, cc , dd, aa这样的数据.如果有重复数据, ...

  7. python开发的程序中以电子表格显示数据_使用 Python 读取电子表格中的数据实例详解...

    Python 是最流行.功能最强大的编程语言之一.由于它是自由开源的,因此每个人都可以使用.大多数 Fedora 系统都已安装了该语言.Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数 ...

  8. android c++ socket编程,C++ 中 socket编程实例详解

    C++ 中 socket编程实例详解 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW):基于TCP的soc ...

  9. Qt中事件循环机制详解

    问题1:Qt中常见的事件有哪些? 答:鼠标事件(QMouseEvent).键盘事件(QKeyEvent).绘制事件(QPaintEvent).窗口尺寸改变(QResizeEvent).滚动事件(QSc ...

最新文章

  1. oracle如何计算2个坐标的距离,百度地图两个坐标之间的距离计算
  2. Android官方网站
  3. [C语言]关于指针和int型的一道题目
  4. android远程命令行工具,Android 使用 adb命令 远程安装apk
  5. tensorflow越跑越慢_tensorflow如何解决越运行越慢的问题
  6. 深度学习 《RNN模型》
  7. 树结构的储存与特点(相关基础知识)
  8. [论文阅读] Learning a Unified Classifier Incrementally via Rebalancing
  9. matlab 游标 精度,如何在MATLAB数据光标中显示更高精度的数字?
  10. NHibernate视频教程
  11. html ui 下拉列表,html - 如何给样式Material-ui选择字段下拉菜单?
  12. PotPlayer和MPC-HC挂载VSFilterMod加载外挂特效字幕的方法
  13. 回归分析beta值的标准_Beta值的基本原理及使用说明
  14. vs2021下载步骤
  15. psn注册什么服务器,怎么注册PSN港服账号?PSN港服官网注册教程
  16. 31个全网最常用python实现(体系学习,学完显著提高代码复用能力)
  17. 如何系统的学习linux
  18. 为什么计算机起始时间、为什么Java时间戳、是1970年1月1日?
  19. winxp右键进入dos
  20. 图像处理的一些基础知识

热门文章

  1. 可真刑!两高中生用 AI 生成涩图,疯狂变现
  2. C语言 缓存区溢出 3221225725
  3. LTE下行传输机制--PDCCH
  4. 获取摩拜单车在地区的车辆python多线程实现
  5. IMX6ULL学习笔记(11)——获取和编译官方SDK
  6. 点赋科技:淘宝产品标签是在哪里?
  7. 网赚项目:怎么做好一个副业,视频号的引流及变现模式
  8. 自已动手搭建软件路由器
  9. Centos7.6编译升级openssl、openssh服务,关闭rpcbind服务
  10. cocos creator 碰撞检测