[QT] QMap使用详解

[QT] QMap使用详解[QT]QMap使用详解一.目录1.实例化QMap对象2.插入数据3.移除数据4.遍历数据5.由键查找对应键值6.由键值查找键7.修改键值8.查找是否包含某个键9.获取所有的键和键值10.一个键对应多个值1.实例化QMap对象/*创建QMap实例,第一个参数为QString类型的键,第二个参数为int类型的值*/QMap<QString,int>map;2.插入数据/*插入数据两种方式*/

大家好,又见面了,我是你们的朋友全栈君。

[QT] QMap使用详解

一. 目录

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

1. 实例化QMap对象

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

2. 插入数据

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

打印输出: QMap((“English”, 99)(“math”, 100))
3. 移除数据

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

打印输出:QMap((“English”, 99))
4. 遍历数据

    /* 遍历数据 (先随便插入几个)*/
    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;
    }

打印输出:两种方法输出一样
“Chinese” : 98
“English” : 99
“Math” : 100
“biological” : 95
“chemical” : 96
“physical” : 97
5. 由键查找对应键值

     map.value("Math");

打印输出:100
6. 由键值查找键

map.key(100);

打印输出:“Math”
7. 修改键值

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

打印输出:120
8. 查找是否包含某个键

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

打印输出:true
9. 获取所有的键和键值

    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)

10. 一个键对应多个值

    /* 使用QMultiMap类来实例化一个QMap对象 */
    QMultiMap<QString, QString> multiMap;
    multiMap.insert("People", "Name");
    multiMap.insert("People", "Gender");
    multiMap.insert("People", "Age");
    multiMap.insert("People", "Height");
    multiMap.insert("People", "Weight");
    qDebug() << multiMap;
    /* 从打印结果可以看出multiMap仍为一个QMap对象 */

打印输出:QMap((“People”, “Weight”)(“People”, “Height”)(“People”, “Age”)(“People”, “Gender”)(“People”, “Name”))

    qDebug() << multiMap.count("People");
    qDebug() <<  multiMap.value("People");
    qDebug() <<  multiMap.values("People");
    qDebug() <<  multiMap.values("People")[4];

打印输出:
5
“Weight”
(“Weight”, “Height”, “Age”, “Gender”, “Name”)
“Name”
通过上面输出可以看出,直接使用value()方法的得到的是最后插入的项;而通过values()方法可以得到所有的键值;如果要得到某个确定的键值可以使用.at()方法。

11. 自定义QMap类
QMap仅有键和键值,作为一个容器,它只能使两个数据产生一一对应关系,但是目前我有三个数据需要关联起来,一开始我是这样做的

    QMap<QString, int> mapOfId; 
    QMap<QString, QDateTime>mapOfTime;

使用两个Qmap就能达到要求,后面发觉还是有点麻烦,索性用QList自定义了一个能存储三个值的容器
美其名曰 CMAP

  1. 新建->Library–>C++ Library–>自定义库名称
  2. cmap.h 函数声明
  3. cmap.cpp 函数定义
  4. 点击运行,生成静态链接库

cmap.h文件实现

#ifndef CMAP_H
#define CMAP_H

#include "CMAP_global.h"
#include <QStringList>
#include <QDebug>
#include <QList>

class CMAP_EXPORT CMAP
{ 
   
public:
    CMAP();

    void insert(int key, QString value1, int value2); /* 插入一行数据 */
    void insert(QList<int> keys, QStringList value1s, QList<int> value2s); /* 插入多行数据 */
    QList<int> keys() const; /* 获取所有键 */
    QStringList value1s() const; /* 获取所有值1 */
    QList<int> value2s() const; /* 获取所有值2 */
    QString value1(int key) const; /* 由键值得到对应值1 */
    int value2(int key) const; /* 由键值得到对应值2 */
    int key(QString value1) const; /* 由值1获取键值 */
    bool contains(int key) const; /* 判断是否包含键 */
    bool contains(QString value1) const; /* 判断是否包含值1 */
    bool remove(int key);  /* 通过键删除一行数据 */
    bool remove(QString value1); /* 通过值1删除一行数据 */
    void clear(); /* 清除map */
    int size() const; /* 返回map长度 */
    void print() const; /* 打印所有<键,值1,值2> */

private:

    QList<int> key_list;
    QStringList value1_list;
    QList<int> value2_list;


};

#endif // CMAP_H

cmap.cpp文件实现

#include "cmap.h"

CMAP::CMAP()
{ 
   
    clear();
}

void CMAP::insert(int key, QString value1, int value2)
{ 
   
    key_list << key;
    value1_list << value1;
    value2_list << value2;
}

void CMAP::insert(QList<int> keys, QStringList value1s, QList<int> value2s)
{ 
   
    Q_ASSERT(keys.size() == value1s.size());
    Q_ASSERT(keys.size() == value2s.size());
    key_list << keys;
    value1_list << value1s;
    value2_list << value2s;
}

QList<int> CMAP::keys() const
{ 
   
    return key_list;
}

QStringList CMAP::value1s() const
{ 
   
    return value1_list;
}

QList<int> CMAP::value2s() const
{ 
   
    return value2_list;
}


bool CMAP::contains(int key) const
{ 
   
    if(key_list.contains(key)) return true;
    else return false;
}

bool CMAP::contains(QString value1) const
{ 
   
    if(value1_list.contains(value1)) return true;
    else return false;
}

bool CMAP::remove(int key)
{ 
   
    if(!this->contains(key)) return false;

    int i = key_list.indexOf(key);
    key_list.removeAt(i);
    value1_list.removeAt(i);
    value2_list.removeAt(i);
    return true;
}

bool CMAP::remove(QString value1)
{ 
   
    if(!this->contains(value1)) return false;

    int i = value1_list.indexOf(value1);
    key_list.removeAt(i);
    value1_list.removeAt(i);
    value2_list.removeAt(i);
    return true;
}

void CMAP::clear()
{ 
   
    key_list.clear();
    value1_list.clear();
    value2_list.clear();
}

int CMAP::size() const
{ 
   
    return key_list.size();
}

void CMAP::print() const
{ 
   
    for(int i = 0; i < size(); i++) { 
   
        qDebug() << QString("key:%1 value1:%2 value2:%3").
                    arg(key_list.at(i)).
                    arg(value1_list.at(i)).
                    arg(value2_list.at(i));
    }
}


QString CMAP::value1(int key) const
{ 
   
    if(!this->contains(key)) return "";

    int i = key_list.indexOf(key);
    return value1_list.at(i);
}

int CMAP::value2(int key) const
{ 
   
    if(!this->contains(key)) return -1;

    int i = key_list.indexOf(key);
    return value2_list.at(i);
}

int CMAP::key(QString value1) const
{ 
   
    if(!this->contains(value1)) return -1;
    int i = value1_list.indexOf(value1);
    return key_list.at(i);
}

CMAP_global.h文件不变即可
生成的文件可以直接使用
在这里插入图片描述
免积分下载源文件

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/139194.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • origin作图图例老是消失_origin画的图不见了

    origin作图图例老是消失_origin画的图不见了记录origin画图遇到的问题及其软件bug解决画图问题如何快速绘制框架画图问题如何快速绘制框架本例子以origin2021版本问题的提出:导入数据之后没有上框和右框(如图)目的:入Excel数据之后直接有上框和右框(也就是能不能设置这么一个模板),如图:解决方法方法一点击图片,找到我红色框的地方,点击即可(据说这种方法在2020版本及其以上即可支持)效果图:方法二:点击查看–显示–框架效果图:PS:美中不足的是,该方法不可以撤销…

  • 解决在打开word时,出现 “word 在试图打开文件时遇到错误” 的问题(亲测有效)[通俗易懂]

    解决在打开word时,出现 “word 在试图打开文件时遇到错误” 的问题(亲测有效)[通俗易懂]1.问题描述:最近在网上查找期刊论文的模板时,发现从期刊官网下载下来的论文格式模板,在本地用word打开时,出现错误,情况如下2.解决办法1.关闭提示窗口,打开左上角的【文件】按钮2.点击【选项】按钮3.点击【信任中心】>>>>【信任中心设置】4.选择【受保护视图】选项卡,将右侧窗口中红色框选的三个打勾选项取消打勾,点击确定,依次退出5.重新打开w…

  • 硕士论文计算机要求,计算机硕士论文格式要求

    硕士论文计算机要求,计算机硕士论文格式要求

    2021年11月27日
  • 一眼看懂map和flatmap的区别

    一眼看懂map和flatmap的区别map的作用很容易理解就是对rdd之中的元素进行逐一进行函数操作映射为另外一个rdd。flatMap的操作是将函数应用于rdd之中的每一个元素,将返回的迭代器的所有内容构成新的rdd。通常用来切分单词。Spark中map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象;而flatMap函数则是两个操作的集合——正是“先映射后扁平化”:操作1:同map函数一样:对每一条输入进…

  • html中添加背景音乐的标签,添加背景音乐的html标签是什么

    html中添加背景音乐的标签,添加背景音乐的html标签是什么添加背景音乐的html标签是,bgsound是用以插入背景音乐,但只适用于IE,在netscape和firefox中并不适用,其参数设定很少,语法如“”。添加背景音乐的html标签是。bgsound是用以插入背景音乐,但只适用于IE,在netscape和firefox中并不适用,其参数设定很少。如下src=”bjyy.mp3″设定背景音乐文件及路径,可以是相对路径或绝对路径。(不…

  • win11频繁更新,关闭win11恶意软件删除工具补丁更新

    win11频繁更新,关闭win11恶意软件删除工具补丁更新win11补丁更新主要包含4部分:第一部分功能更新,涉及Windows功能bug、新增的功能等;第二部分质量更新,涉及安全风险的更新;第三部分驱动更新,涉及厂商等提交给微软的驱动,进行更新;第四部分其它更新,目前主要发现的是,恶意软件删除工具更新。恶意软件删除工具,如果有第三方安全软件的话,这个补丁意义不大,并且恶意的标准是微软自家定义的,就看你是否接受微软自带的杀毒软件,如果用可以更新,如果不用该补丁频率高,无必要。关闭“恶意软件删除更新”,只需要用dism++关闭,步骤如下:

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号