QMap

本文详细介绍了Qt容器类型QMap的功能和用法,包括插入、查询、删除元素的操作方式,以及如何遍历QMap等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QMap

QMap<Key,T>是Qt容器类型的一种,它通过(Key, value)存储一对值,并通过Key可以查找与之关联的value的值。

QMapQHash是很相似的,不同的地方是:
- QHash的查找速度比QMap要快很多。
- 在对QHash进行迭代时,这些项是任意排序的。在QMap中,项总是按键排序。
- QHash的关键类型必须提供运算符==()和全局QHash(key)函数。QMap的关键类型必须提供操作符<(),以指定全序顺序。从Qt 5.8.1开始,使用指针类型作为键也是安全的,即使底层操作符<()不提供全序关系。


这里有一个带有QString类型关键字和 int类型值的QMap示例:

QMap<QString,int> map;

你可以用运算符[ ]插入一对 (key,value) 到QMap对象中:

//依次插入了三对值,("one",1), ("three",3),("seven",7)
map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;

除了使用运算符[ ]外,还可以使用函数insert() 插入

map.insert("twelve",12);        //插入("twelve",12)   

如果想要查询QMap对象中的值,使用运算符[ ] 或者函数 value()

//通过关键字tirteen查找对应的值
int num1 = map["thirteen"];
int num2 = map.value("thirteen");

查看QMap对象中是否包含某一项,使用函数contains() //存在返回true,否则,返回false

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

假设QMap对象中 TIMEOUT 关键字不存在

int timeout = map.value("TIMEOUT",30);
//value()函数返回第二个参数30

通常,我们建议使用contains()value()而不是操作符[]()来查找QMap对象中的键。原因是,如果QMap对象中,不存在要查找的关键项,那么操作符[]()会在QMap对象中自动地插入一个项。
例如。在这个例子中,将会创建1000个项在QMap对象中

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

要遍历QMap对象中的所有项,可以使用 迭代器(iterator).QMap提供了java风格的迭代器(QMapIteratorQMutableMapIterator)和STL样式的迭代器(QMap::const_iteratorQMap::iterator)。

如何使用java风格的迭代器

// QMapIterator(const QMap<Key, T> &map)
QMapIterator<QString,int> i (map);
while (i.hasNext()) {
      i.next();
      cout << i.key() << ": " << i.value() << endl;
  }

**如何使用STL样式的迭代器

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

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

map.insert("plenty",100);
map.insert("plenty",2000);
//"plenty"对应的值100,修改为2000

如果想让一个键对应多个值,可以通过调用函数insertMulti()实现(或者QMultiMap类实现).
检索一个键对应的所有值,使用函数values(const Key &key) ,这个函数返回一个QList类模板。

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

另一种方法是调用find()来获取第一个项的STL样式迭代器,并从获取的迭代器开始迭代。

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

如果你只需要从QMap对象中查看值(不是键),可以使用foreach循环

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

插入的项也可以从QMap对象中删除。
第一种方法是:调用remove() //int QMap::remove(const Key &key) 函数,这将删除给定键的所有相关项。
第二种方法是:调用QMutableMapIterator::remove()
第三种方法是:调用clear(),清空了QMap对象。


QMap的键值和值数据类型必须是assignable data types。这种类型覆盖了你会遇见的所有类型。但是,例如,编译器不会让您将QWidget作为一个值存储; 相反,存储一个QWidget *。此外,QMap的键类型必须提供操作符<()。QMap使用它来保存它的条目,并假设如果x和y都不是true,那么x和y两个键都是相等的。

#ifndef EMPLOYEE_H
  #define EMPLOYEE_H

  class Employee
  {
  public:
      Employee() {}
      Employee(const QString &name, const 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

在这个例子中,我们首先比较员工的名字。如果它们是相等的,我们就比较它们的出生日期.

Qt 中,清空 `QMap` 容器可以通过多种方法实现,具体取决于使用场景和资源管理方式。以下是几种常见方式: ### 使用 `clear()` 方法 `QMap` 提供了内置的 `clear()` 方法用于清空容器中的所有键值对。此方法不会释放与值相关联的资源(如动态分配的指针),但可以安全地用于普通值类型。 ```cpp QMap<int, QString> map; map.insert(1, "One"); map.insert(2, "Two"); map.clear(); // 清空容器 ``` ### 使用 `qDeleteAll()` 方法 如果 `QMap` 的值类型是指针类型(例如 `QMap<int, MyObject*>`),则可以使用 `qDeleteAll()` 函数来释放指针所指向的对象内存。需要注意,`qDeleteAll()` 仅适用于值类型为指针的情况,否则会引发编译错误。 ```cpp QMap<int, MyObject*> objectMap; objectMap.insert(1, new MyObject()); objectMap.insert(2, new MyObject()); qDeleteAll(objectMap); // 删除所有指针对象 objectMap.clear(); // 清空容器 ``` ### 手动删除指针值 如果希望在清空时对指针值进行更细粒度的控制,也可以通过遍历 `QMap` 手动删除每个指针值。 ```cpp QMap<int, MyObject*> objectMap; // 插入对象 for (auto it = objectMap.begin(); it != objectMap.end(); ++it) { delete it.value(); // 手动删除指针值 } objectMap.clear(); // 清空容器 ``` ### 使用智能指针管理资源 为了简化资源管理并避免内存泄漏,建议使用智能指针(如 `std::unique_ptr` 或 `std::shared_ptr`)作为 `QMap` 的值类型。这样,在容器清空时,智能指针会自动释放相关资源。 ```cpp #include <memory> QMap<int, std::shared_ptr<MyObject>> objectMap; objectMap.insert(1, std::make_shared<MyObject>()); objectMap.clear(); // 智能指针自动释放资源 ``` ### 使用隐式共享特性 `QMap` 支持隐式共享(Copy-On-Write),因此在赋值或拷贝时不会立即复制数据,直到需要修改时才会进行深拷贝。这一特性使得 `QMap` 在多线程环境中高效且安全[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值