目录

深入剖析 Qt QMap:原理、应用与技巧

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

qt中全局qmap变量初始化方式

Qt之QMap基本用法

Qt扫盲-QMap理论总结

-----------------------------------------------------------

如果你想检查map中是否包含某个键,可以使用contains() :

int timeout = 30;
if (map.contains("TIMEOUT") )
    timeout = map.value("TIMEOUT") ;

==================================

Qt扫盲-QMap理论总结

QMap理论总结

    一、概述
    二、使用
        1. 初始化及属性
        2. 插入元素
        3. 查找值,获取值
        4. 遍历键值对
        5. 删除元素
        6. 注意

一、概述

QMap 是Qt的通用容器类之一。它存储(键,值) 对,并提供与键相关联的值的快速查找。其实就是一个键值对的集合,经常使用的。具体更详细还得看看帮助文档

QMap和QHash提供了非常相似的功能。区别在于:

    QHash提供了比QMap更快的平均查找速度。
    在遍历QHash时,元素的顺序是任意的。在QMap中,元素总是按键排序了的。
    QHash的键类型必须提供==() 运算符和一个全局的QHash (key) 函数。QMap的键类型必须提供<运算符来指定总顺序。由于Qt 5.8.1,使用指针类型作为键也是安全的,即使底层运算符<() 没有提供总的顺序。

二、使用

1. 初始化及属性

下面是一个QMap的例子,键为QString,值为int:

QMap<QString, int> map;

常用的函数:

    size() :Map的大小
    empty():是不是空
    key():这个第一个元素的键
    keys():返回所有的键
    values():返回所有的值

2. 插入元素

要在map中插入一个(键,值) 对,可以使用 运算符:

map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;

这会将以下3个键值对插入到QMap中:(“one”, 1) 、(“three”, 3) 和(“seven”, 7) 。

另一种向map中插入元素的方法是使用insert() :

map.insert("twelve", 12) ;

通常,QMap每个键只允许一个值。如果使用QMap中已经存在的键调用insert() ,之前的值将被删除。例如:

map.insert("plenty", 100) ;
map.insert("plenty", 2000) ;
// map.value("plenty")  == 2000

我们也可以使用insertMulti() 而不是insert() 来为每个键存储多个值(或者使用便捷的子类QMultiMap) 。如果想取得一个键对应的所有值,可以使用values(const key &key) ,它会返回一个QList:

QList<int> values = map.values("plenty") ;
for (int i = 0; i < values.size() ; ++i)
    cout << values.at(i)  << Qt::endl;

共享相同键的项可以从最近插入到最近插入。另一种方法是调用find() 来获取第一个键对应的stl风格的迭代器,也就是说find() 返回的也是一个可迭代的对象,我们可以从那里开始迭代:

QMap<QString, int>::iterator i = map.find("plenty") ;
while (i != map.end()  && i.key()  == "plenty")  {
      cout << i.value()  << Qt::endl;
      ++i;
}

3. 查找值,获取值

要查找一个值,可以使用operator 或value() :

int num1 = map["thirteen"];
int num2 = map.value("thirteen") ;

如果在map中没有指定键的项,这些函数返回一个默认构造的值。就是这个键的构造函数,然后像int、double之类的就是0,QString 就是空字符串。

如果你想检查map中是否包含某个键,可以使用contains() :

int timeout = 30;
if (map.contains("TIMEOUT") )
    timeout = map.value("TIMEOUT") ;

还有一个value() 重载方法,如果指定的键不存在,则使用第二个参数作为默认值:

int timeout = map.value("TIMEOUT", 30) ;

一般来说,我们推荐使用contains() 和value() 而不是 [ ] 在map中查找键。因为如果map中不存在键相同的元素,[ ]会静默地将元素插入到 map 中(除非map是const) 。有时候就要非常注意这个问题。例如,下面的代码片段将在内存中创建1000个元素:

// WRONG
QMap<int, QWidget *> map;
  ...
for (int i = 0; i < 1000; ++i)  {
    if (map[i] == okButton)
        cout << "Found button at index " << i << Qt::endl;
}

为了避免这个问题,将上面代码中的map[i]替换为map.value(i) 。


4. 遍历键值对

如果想遍历存储在QMap中的所有键值对,可以使用迭代器。QMap提供了java风格的迭代器(QMapIterator和QMutableMapIterator) 和stl风格的迭代器(QMap::const_iterator和QMap::iterator) 。

下面是如何使用java风格的迭代器迭代QMap<QString, int>:

QMapIterator<QString, int> i(map) ;
while (i.hasNext() )  {
      i.next() ;
      cout << i.key()  << ": " << i.value()  << Qt::endl;
}

下面是相同的代码,但这次使用了stl风格的迭代器:

QMap<QString, int>::const_iterator i = map.constBegin() ;
while (i != map.constEnd() )  {
      cout << i.key()  << ": " << i.value()  << Qt::endl;
      ++i;
  }

每一个键值对 都是 按键升序遍历。

如果你只需要从map中提取值(而不是键) ,你也可以使用foreach:

QMap<QString, int> map;
  ...
foreach (int value, map)
      cout << value << Qt::endl;

5. 删除元素

有几种方法可以从QMap中删除元素。

一种方法是调用remove() 方法;这将删除具有给定键的任何项。

另一种方法是使用QMutableMapIterator::remove() 。

此外,你可以使用clear() 清除整个QMap。

6. 注意

QMap的键和值数据类型必须是可分配的数据类型。这涵盖了您可能遇到的大多数数据类型,但是编译器不允许您将QWidget存储为值;相反,存储一个QWidget *。此外,QMap的键类型必须提供<运算符。QMap使用它来排序元素,如果x < y和y < x都不为真,则假设两个键x和y相等。
例子:

  #ifndef EMPLOYEE_H
  #define EMPLOYEE_H

  class Employee
  {
  public:
      Employee()  {}
      Employee(const QString &name, QDate dateOfBirth) ;
      ...

  private:
      QString myName;
      QDate myDateOfBirth;
  };

  inline bool operator<(const Employee &e1, const Employee &e2)
  {
      if (e1.name()  != e2.name() )
          return e1.name()  < e2.name() ;
      return e1.dateOfBirth()  < e2.dateOfBirth() ;
  }

  #endif // EMPLOYEE_H

在这个例子中,我们首先比较员工的名字。如果他们相等,我们比较他们的出生日期来打破平局。

————————————————
版权声明:本文为CSDN博主「太阳风暴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43680827/article/details/128549334

深入剖析 Qt QMap:原理、应用与技巧

QMap的优缺点

QMap 是 Qt 框架中提供的一种关联容器,它以键值对的形式存储数据。QMap 的键和值可以是任意类型,只要键类型具有“小于”操作符(<)即可。QMap 的内部实现基于平衡二叉搜索树,因此具有以下优缺点:

优点:

    有序:QMap 中的键值对是按键的顺序(升序)存储的。这使得在需要有序数据时,QMap 是一个很好的选择。
    查找速度:由于基于平衡二叉搜索树的实现,QMap 的查找速度为 O(log n),在大量数据的情况下依然具有较好的性能。
    插入和删除速度:QMap 的插入和删除操作速度也为 O(log n),相对较快。
    默认构造:QMap 提供了便捷的默认构造方法,可以轻松地创建和初始化 QMap 实例。
    自动排序:在插入新元素时,QMap 会自动对键进行排序。这意味着不需要手动排序,节省了开发时间。
    容易遍历:使用迭代器,可以方便地遍历 QMap 中的所有键值对。

缺点:

    内存占用:由于基于树形结构的实现,QMap 相较于基于哈希表的 QHash 而言,内存占用较大。
    查找速度慢于 QHash:虽然 QMap 的查找速度为 O(log n),但在某些场景下,如查找速度非常关键的场合,QHash 的平均查找速度为 O(1),更快一些。
    对键类型的要求:QMap 要求键类型具有“小于”操作符(<),这对某些自定义数据类型可能需要额外实现。而 QHash 只需实现哈希函数和相等操作符即可。

总的来说,QMap 适用于需要有序、查找速度较快的场景。然而,如果内存占用和查找速度是优先考虑的因素,QHash 可能是一个更好的选择。在实际开发中,需要根据具体需求来选择适合的容器类型。
————————————————
版权声明:本文为CSDN博主「泡沫o0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21438461/article/details/130243580

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

一、简介

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

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

二、常用方法

1. 实例化QMap对象

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

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;

qt中全局qmap变量初始化方式

https://wenku.csdn.net/answer/0668c9cca9ba47a3851451c897ff7e3c?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-chatgpt-2%7Edefault%7EOPENSEARCH%7EPosition-17-0668c9cca9ba47a3851451c897ff7e3c-blog-119061654.235%5Ev38%5Epc_relevant_sort_base3&depth_1-utm_source=distribute.pc_relevant.none-task-chatgpt-2%7Edefault%7EOPENSEARCH%7EPosition-17-0668c9cca9ba47a3851451c897ff7e3c-blog-119061654.235%5Ev38%5Epc_relevant_sort_base3&utm_relevant_index=23

Qt之QMap基本用法

阿姝shu

  QMap<Key, T>是Qt的通用容器类之一。它存储(键、值)对,并提供与键相关联的值的快速查找。

  QMap和QHash提供了非常相似的功能,他们的差异是:

  • QHash提供了比QMap更快的查找速度。(详情请参阅算法复杂性。)
  • 在QHash上迭代时,项目的顺序是任意的。而使用QMap时,项总是按键排序。
  • QHash的键类型必须提供operator==()和全局QHash(key)函数。QMap的键类型必须提供操作符<(),以指定全序顺序。从Qt5.8.1版本开始,使用指针类型作为键也是安全的,即使底层操作符<()没有提供全序关系。
    (以上来自Qt帮助文档)

需要包含头文件:

#include <QMap>

QMap中插入(键、值)对

QMap<QString, int> map;
map["LiMing"]= 14;
map.insert("BaiMing", 12);

map.insert("LiMuu", 20);
map.insert("LiMuu",100);

  可以用两种方式插入。这里注意,往同样的键中重复写值时,新的值会将旧的值替代,LiMuu此时的值为100。如果想重复写同样的键,可以使用insertMulti()函数。例如:

map.insert("LiMuu", 20);
map.insertMulti("LiMuu",100);

检索键对应的所有值

QList<int> values = map.values("LiMuu");
for (int i = 0; i < values.size(); i++)
      qDebug()<<values.at(i);

  使用函数values()获取一个键对应的所有值,这个函数返回QList类模板。

获取值

QMap<QString, int> map;
map.insert("LiMuu", 20);
int num=0;
num= map.value("LiMuu");
num= map["LiMuu"];

  可以用两种方式获取键对应的值。

循环获取值

foreach (int value, map)
    {
        qDebug()<<value;
    }

查询包含某项

qDebug()<<map.contains("LiMuu");

  用contains()函数可以查询QMap对象中是否包含某一项,如果存在返回true,否则返回false。

Logo

数据库是今天社会发展不可缺少的重要技术,它可以把大量的信息进行有序的存储和管理,为企业的数据处理提供了强大的保障。

更多推荐