QMap详解「建议收藏」

QMap详解「建议收藏」QMap详解QMap是Qt的一个模板类,它是基于红黑树算法的一套字典。QMap<Key,T>是Qt容器类型的一种,它通过(Key,value)存储一对值,并通过Key可以查找与之关联的value的值。QMap和QHash是很相似的,不同的地方是:QHash的查找速度比QMap要快很多。在对QHash进行迭代时,这些项是任意排序的。在QMap中,项总是按键排序。QHash的关键类型必须提供运算符==()和全局QHash(key)函数。QMap的关键类型必须提供操作符<(

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

QMap详解

QMap是Qt的一个模板类,它是基于红黑树算法的一套字典。

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

QMap QHash是很相似的,不同的地方是:

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

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

 QMap<QString, int> map;

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

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

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

 map.insert("twelve", 12);

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

 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 关键字不存在, value() 函数返回第二个参数:

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

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

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

为了避免这个错误,应当用map.value(i) 代替 map[i]

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

如何使用java风格的迭代器

 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;
     ++i;
 }

通常,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对象。

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

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

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138992.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • latex中如何画表格_时态结构总结表格

    latex中如何画表格_时态结构总结表格三线表表格的合并三线表在写论文的时候我们常常会用到三线表,三线表的基本语法就是下面这个样子的。如果是在双栏的环境里,如果我们的表格比较大,我们一般需要在表格的环境中加星号,如果是表格只占一栏,这个时候我们就不需要加星号,我们假设我们使用表格的情况是占双栏的。三线表的精华就是那三根线了啦,用的命令就是\toprule,\midrule,\bottomrule这…

    2022年8月11日
    7
  • linux下打包命令_linux常用命令全集

    linux下打包命令_linux常用命令全集linux系统中遇到要打包文件的时候我们该使用什么命令呢?下面由秋天网Qiutian.ZqNF.Com小编为大家整理了linux系统中打包文件的命令详解的相关知识,希望对大家有帮助!linux系统中打包文件的命令详解tartar的选项与参数非常的多!我们只讲几个常用的选项,更多选项您可以自行mantar查询啰![[emailprotected]~]#tar[-j|-z][cv]…

    2022年8月24日
    8
  • CSS实现水平垂直居中的1010种方式(史上最全)

    CSS实现水平垂直居中的1010种方式(史上最全)

    2021年6月12日
    137
  • U41492 树上数颜色(dsu)「建议收藏」

    U41492 树上数颜色(dsu)「建议收藏」U41492树上数颜色题意:输入n(1e5)n(1e5)n(1e5)表示一棵根为1的树有nnn个节点接下来n−1n-1n−1行每行u,vu,vu,v表示树边接下来一行nnn个数,c1,c2,…,cn(1≤ci≤n)c_1,c_2,\dots,c_n(1\leqc_i\leqn)c1​,c2​,…,cn​(1≤ci​≤n)表示节点颜色接下来m(m≤n)m(m\leqn)m(m≤n)…

    2025年6月15日
    3
  • PYTHON 2021.5.3激活码【在线注册码/序列号/破解码】

    PYTHON 2021.5.3激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    47
  • TIMEWAIT状态「建议收藏」

    TIMEWAIT状态「建议收藏」TIMEWAIT是友好的修改内核参数/proc/sys/net/ipv4/tcp_tw_recycle来快速回收被关闭的socket,使得TCP连接根本就不进入TIME_WAIT状态客户端在接收到服务器发送的FIN段后,没有立即进入CLOSED状态,而是进入TIME_WAIT状态;在TIME_WAIT状态,客户端连接要等待一段长为2MSL的时间才能完全关闭。TIME_WAIT状态存在的原因有…

    2022年5月1日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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