深入剖析 Qt QMap:原理、应用与技巧:问题和解决方案 (**)
深入剖析 Qt QMap:原理、应用与技巧
目录
深入剖析 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_Hclass 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变量初始化方式
Qt之QMap基本用法
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。
更多推荐
所有评论(0)