• [QT] QMap使用详解


    一. 目录

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

    1. 实例化QMap对象

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

    2. 插入数据

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

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

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

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

    1. /* 遍历数据 (先随便插入几个)*/
    2. map.insert("Math", 100);
    3. map.insert("Chinese", 98);
    4. map.insert("physical", 97);
    5. map.insert("chemical", 96);
    6. map.insert("biological", 95);
    7. /* 遍历数据要使用迭代器,QT提供了两种方式的迭代 */
    8. /* 第一种是Java类型的迭代 */
    9. QMapIterator<QString, int> iterator(map);
    10. while (iterator.hasNext()) {
    11. iterator.next();
    12. qDebug() << iterator.key() << ":" << iterator.value();
    13. }
    14. /* 第二种是STL类型的迭代 */
    15. QMap<QString, int>::const_iterator iterator_1 = map.constBegin();
    16. while (iterator_1 != map.constEnd()) {
    17. qDebug() << iterator_1.key() << ":" << iterator_1.value();
    18. ++iterator_1;
    19. }

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

         map.value("Math");
    

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

    map.key(100);
    

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

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

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

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

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

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

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

    10. 一个键对应多个值

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

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

    11. 自定义QMap类

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

    1. QMap<QString, int> mapOfId;
    2. QMap<QString, QDateTime>mapOfTime;

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

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

    cmap.h文件实现

    1. #ifndef CMAP_H
    2. #define CMAP_H
    3. #include "CMAP_global.h"
    4. #include <QStringList>
    5. #include <QDebug>
    6. #include <QList>
    7. class CMAP_EXPORT CMAP
    8. {
    9. public:
    10. CMAP();
    11. void insert(int key, QString value1, int value2); /* 插入一行数据 */
    12. void insert(QList<int> keys, QStringList value1s, QList<int> value2s); /* 插入多行数据 */
    13. QList<int> keys() const; /* 获取所有键 */
    14. QStringList value1s() const; /* 获取所有值1 */
    15. QList<int> value2s() const; /* 获取所有值2 */
    16. QString value1(int key) const; /* 由键值得到对应值1 */
    17. int value2(int key) const; /* 由键值得到对应值2 */
    18. int key(QString value1) const; /* 由值1获取键值 */
    19. bool contains(int key) const; /* 判断是否包含键 */
    20. bool contains(QString value1) const; /* 判断是否包含值1 */
    21. bool remove(int key); /* 通过键删除一行数据 */
    22. bool remove(QString value1); /* 通过值1删除一行数据 */
    23. void clear(); /* 清除map */
    24. int size() const; /* 返回map长度 */
    25. void print() const; /* 打印所有<键,值1,值2> */
    26. private:
    27. QList<int> key_list;
    28. QStringList value1_list;
    29. QList<int> value2_list;
    30. };
    31. #endif // CMAP_H

    cmap.cpp文件实现

    1. #include "cmap.h"
    2. CMAP::CMAP()
    3. {
    4. clear();
    5. }
    6. void CMAP::insert(int key, QString value1, int value2)
    7. {
    8. key_list << key;
    9. value1_list << value1;
    10. value2_list << value2;
    11. }
    12. void CMAP::insert(QList<int> keys, QStringList value1s, QList<int> value2s)
    13. {
    14. Q_ASSERT(keys.size() == value1s.size());
    15. Q_ASSERT(keys.size() == value2s.size());
    16. key_list << keys;
    17. value1_list << value1s;
    18. value2_list << value2s;
    19. }
    20. QList<int> CMAP::keys() const
    21. {
    22. return key_list;
    23. }
    24. QStringList CMAP::value1s() const
    25. {
    26. return value1_list;
    27. }
    28. QList<int> CMAP::value2s() const
    29. {
    30. return value2_list;
    31. }
    32. bool CMAP::contains(int key) const
    33. {
    34. if(key_list.contains(key)) return true;
    35. else return false;
    36. }
    37. bool CMAP::contains(QString value1) const
    38. {
    39. if(value1_list.contains(value1)) return true;
    40. else return false;
    41. }
    42. bool CMAP::remove(int key)
    43. {
    44. if(!this->contains(key)) return false;
    45. int i = key_list.indexOf(key);
    46. key_list.removeAt(i);
    47. value1_list.removeAt(i);
    48. value2_list.removeAt(i);
    49. return true;
    50. }
    51. bool CMAP::remove(QString value1)
    52. {
    53. if(!this->contains(value1)) return false;
    54. int i = value1_list.indexOf(value1);
    55. key_list.removeAt(i);
    56. value1_list.removeAt(i);
    57. value2_list.removeAt(i);
    58. return true;
    59. }
    60. void CMAP::clear()
    61. {
    62. key_list.clear();
    63. value1_list.clear();
    64. value2_list.clear();
    65. }
    66. int CMAP::size() const
    67. {
    68. return key_list.size();
    69. }
    70. void CMAP::print() const
    71. {
    72. for(int i = 0; i < size(); i++) {
    73. qDebug() << QString("key:%1 value1:%2 value2:%3").
    74. arg(key_list.at(i)).
    75. arg(value1_list.at(i)).
    76. arg(value2_list.at(i));
    77. }
    78. }
    79. QString CMAP::value1(int key) const
    80. {
    81. if(!this->contains(key)) return "";
    82. int i = key_list.indexOf(key);
    83. return value1_list.at(i);
    84. }
    85. int CMAP::value2(int key) const
    86. {
    87. if(!this->contains(key)) return -1;
    88. int i = key_list.indexOf(key);
    89. return value2_list.at(i);
    90. }
    91. int CMAP::key(QString value1) const
    92. {
    93. if(!this->contains(value1)) return -1;
    94. int i = value1_list.indexOf(value1);
    95. return key_list.at(i);
    96. }

    CMAP_global.h文件不变即可
    生成的文件可以直接使用

    在这里插入图片描述

     

  • 相关阅读:
    GIS地图服务数据可视化
    利用Redis实现全局唯一ID
    Java8新特性之方法引用
    【计算机辅助蛋白质结构分析、分子对接、片段药物设计技术与应用】
    Java基础—接口Lock
    c++11知识:auto类型推导
    科技创造价值 | 云扩科技荣登真榜·中国科技创新品牌榜TOP100
    测试工程师如何做到初级测试管理(个人思考)?
    c++函数指针 回调函数
    【云原生】学习K8s,读完这篇就够了
  • 原文地址:https://blog.csdn.net/my_angle2016/article/details/125523310