大家好,又见面了,我是你们的朋友全栈君。
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示例:
代码语言:javascript复制 QMap<QString, int> map;
你可以用运算符[ ]插入一对 (key,value) 到QMap对象中:
代码语言:javascript复制 map["one"] = 1;
map["three"] = 3;
map["seven"] = 7;
除了使用运算符[ ]外,还可以使用函数insert() 插入
代码语言:javascript复制 map.insert("twelve", 12);
如果想要查询QMap对象中的值,使用运算符[ ] 或者函数 value()
代码语言:javascript复制 int num1 = map["thirteen"];
int num2 = map.value("thirteen");
查看QMap对象中是否包含某一项,使用函数contains() //存在返回true,否则,返回false
代码语言:javascript复制 int timeout = 30;
if (map.contains("TIMEOUT"))
timeout = map.value("TIMEOUT");
假设QMap对象中 TIMEOUT 关键字不存在, value() 函数返回第二个参数:
代码语言:javascript复制 int timeout = map.value("TIMEOUT", 30);
通常,我们建议使用contains()和value()而不是操作符来查找QMap对象中的键。原因是,如果QMap对象中,不存在要查找的关键项,那么操作符会在QMap对象中自动地插入一个项。 例如。在这个例子中,将会创建1000个项在QMap对象中
代码语言:javascript复制 // 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风格的迭代器
代码语言:javascript复制 QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
cout << i.key() << ": " << i.value() << endl;
}
如何使用STL样式的迭代器
代码语言:javascript复制 QMap<QString, int>::const_iterator i = map.constBegin();
while (i != map.constEnd()) {
cout << i.key() << ": " << i.value() << endl;
i;
}
通常,QMap只允许每个键对应一个值。如果在QMap中有一个已经存在的键调用insert(),那么前面的值将被删除。例如:
代码语言:javascript复制map.insert("plenty",100);
map.insert("plenty",2000);
//"plenty"对应的值100,修改为2000
如果想让一个键对应多个值,可以通过调用函数insertMulti()实现(或者QMultiMap类实现). 检索一个键对应的所有值,使用函数values(const Key &key) ,这个函数返回一个QList类模板。
代码语言:javascript复制QList<int> values = map.values("plenty");
for (int i = 0; i < values.size(); i)
cout << values.at(i) << endl;
另一种方法是调用find()来获取第一个项的STL样式迭代器,并从获取的迭代器开始迭代。
代码语言:javascript复制QMap<QString, int>::iterator i = map.find("plenty");
while( i != map.end() && i.key() == "plenty)
{
cout << i.value() << endl;
i
}
如果你只需要从QMap对象中查看值(不是键),可以使用foreach循环
代码语言:javascript复制 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两个键都是相等的。
代码语言:javascript复制#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.cn/138992.html原文链接:https://javaforall.cn