QMap的使用(插入、取值、删除、遍历)

一、简介

QMap 提供了一个从类项为 key 的键到类项为T的直的映射,通常所存储的数据类型是一个键对应一个直,并且按照Key的次序存储数据,这个类也支持一键多值的情况,用类 QMultiMap。

QMap 在 Qt 项目实际开发中经常用到,下面讲解一些其的常用方法。

粉丝福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,Qt信号与槽机制,Qt界面开发-图像绘制,Qt网络,Qt数据库编程,Qt项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

二、常用方法

1. 实例化QMap对象

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

2. 插入数据

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

QMap 只允许每个键有一个值。如果使用 QMap 中已存在的键调用Insert(),则先前的值将被擦除。

3. 移除数据

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

成功返回 1,但如果键不在映射中,则返回 0。

4. 遍历数据

/* 遍历数据 (先随便插入几个)*/
map.insert("Math", 100);
map.insert("Chinese", 98);
map.insert("physical", 97);
map.insert("chemical", 96);
map.insert("biological", 95);

/* QT提供了多种方式的迭代 */
// 第一种是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循环遍历
QList<QString> keyList = map.keys(); // 存放的就是QMap的key值
for(int i=0;i<keyList.size();i++)
{
    // 这里知道了key不管是删除还是查找还是啥啥啥都很方便
}

5. 由键查找对应键值

map.value("Math");

如果指定的键不在映射中,会返回默认值,比如QString-int的则返回0,QString-QByteArray的则返回空值。

6. 由键值查找键

map.key(100);

7. 修改键值

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

8. 查找是否包含某个键

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

9. 获取所有的键和键值

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

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类

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

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

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

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

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 文件不变即可,这个生成的文件可以直接使用。

粉丝福利,费领取Qt开发学习资料包、技术视频,内容包括(Qt实战项目视频教程+代码,C++语言基础,C++设计模式,Qt编程入门,Qt信号与槽机制,Qt界面开发-图像绘制,Qt网络,Qt数据库编程,Qt项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓