[QT] QMap使用详解

[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是一种键值对映射的容器类。它可以将一个键与一个值进行关联,并且可以根据键来查找对应的值。 在QMap中,可以使用"[] "运算符来插入或更新键值对。例如,map["key 1"] = 3; 表示将键"key 1"与值3进行关联。如果键已经存在,那么它的值将会被更新。 另外,还可以使用insert()函数来插入键值对。例如,map.insert("key 3", 3); 与 map["key 3"] = 3; 是等价的操作。 要遍历QMap中的键和值,可以使用keys()函数获取所有的键,并通过循环遍历键来获取对应的值。例如,可以使用以下代码来打印所有的键和值: ``` QList<QString> list = map.keys(); for(int i=0; i<list.length(); i++) { qDebug() << list[i << "," << map.value(list[i]); } ``` 另一种遍历QMap的方法是使用迭代器。通过QMap的begin()和end()函数获取迭代器的起始和结束位置,并通过迭代器进行遍历。例如,可以使用以下代码来打印所有的键和值: ``` QMap<QString, int>::const_iterator it; for(it = map.begin(); it != map.end(); it++) { qDebug() << it.key() << "," << it.value(); } ``` 这样,就可以使用QMap的映射函数来进行键值对的插入、更新和遍历操作了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Qt之QMap基本用法](https://blog.csdn.net/qq_41597943/article/details/129158748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [QT-QMap和QHash解析](https://blog.csdn.net/hw5230/article/details/130774666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值