当前位置:嗨网首页>书籍在线阅读

15-关联容器类

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

3.3.3 关联容器类

Qt还提供关联容器类QMap、QMultiMap、QHash、QMultiHash和QSet。

QMultiMap和QMultiHash支持一个键关联多个值,QHash和QMultiHash类使用散列(Hash)函数进行查找,查找速度更快。

1.QSet

QSet是基于散列表的集合模板类,它存储数据的顺序是不定的,查找值的速度非常快。QSet 内部就是用QHash实现的。

定义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类似。