15-关联容器类
3.3.3 关联容器类
Qt还提供关联容器类QMap、QMultiMap、QHash、QMultiHash和QSet。
QMultiMap和QMultiHash支持一个键关联多个值,QHash和QMultiHash类使用散列(Hash)函数进行查找,查找速度更快。
1.QSet
QSet是基于散列表的集合模板类,它存储数据的顺序是不定的,查找值的速度非常快。QSet
定义QSet
QSet<QString> set;
set << "dog" << "cat" << "tiger";
测试一个值是否包含于这个集合,用contains()函数,示例如下:
if (!set.contains("cat"))
...
2.QMap
QMap<Key, T>提供一个字典(关联数组),一个键映射到一个值。QMap存储数据是按照键的顺序,如果不在乎存储顺序,使用QHash会更快。
定义QMap<QString, int>类型变量和赋值的示例代码如下:
QMap<QString, int> map;
map["one"] = 1;
map["two"] = 2;
map["three "] = 3;
也可以使用insert()函数赋值,或remove()移除一个键值对,示例如下:
map.insert("four", 4);
map.remove("two");
要查找一个值,使用运算符“[ ]”或value()函数,示例如下:
int num1 = map["one"];
int num2 = map.value("two");
如果在映射表中没有找到指定的键,会返回一个缺省构造值(default-constructed values),例如,如果值的类型是字符串,会返回一个空的字符串。
在使用value()函数查找键值时,还可以指定一个缺省的返回值,示例如下:
timeout = map.value("TIMEOUT",30);
这表示如果在map里找到键“TIMEOUT”,就返回关联的值,否则返回值为30。
3.QMultiMap
QMultiMap是QMap的子类,是用于处理多值映射的便利类。
多值映射就是一个键可以对应多个值。QMap正常情况下不允许多值映射,除非使用QMap::insertMulti()添加键值对。
QMultiMap是QMap的子类,所以QMap的大多数函数在QMultiMap都是可用的,但是有几个特殊的,QMultiMap::insert()等效于QMap::insertMulti(),QMultiMap::replace()等效于QMap::insert()。
QMultiMap使用示例如下:
QMultiMap<QString, int> map1, map2, map3;
map1.insert("plenty", 100);
map1.insert("plenty", 2000); // map1.size() == 2
map2.insert("plenty", 5000); // map2.size() == 1
map3 = map1 + map2; // map3.size() == 3
QMultiMap不提供“[ ]”操作符,使用value()函数访问最新插入的键的单个值。如果要获取一个键对应的所有值,使用values()函数,返回值是QList
QList<int> values = map.values("plenty");
for (int i = 0; i < values.size(); ++i)
cout << values.at(i) << endl;
4.QHash
QHash是基于散列表来实现字典功能的模板类,QHash<Key, T>存储的键值对具有非常快的查找速度。
QHash与QMap的功能和用法相似,区别在于以下几点:
- QHash比QMap的查找速度快;
- 在QMap上遍历时,数据项是按照键排序的,而QHash的数据项是任意顺序的;
- QMap的键必须提供“<”运算符,QHash的键必须提供“==”运算符和一个名称为qHash()的全局散列函数。
5.QMultiHash
QMultiHash是QHash的子类,是用于处理多值映射的便利类,其用法与QMultiMap类似。