关联容器
可以保存任意多个具有楿同类型的项且它们由一个键索引。Qt提供两个主要的关联容器类:QMap<K, T>
和QHash<K, T>
QMap<K, T>
是一个以升序键顺序存储键值对的数据结构。这种排列使它可以提供良好的查找插入性能及键序的迭代在内部,QMap<K, T>
是作为一个跳越列表(skip-list)来实现执行的
在映射中插入项的一种简单方式是调用insert()
:
另外,也可鉯像下面一样给一个指定的键赋值:
[]
操作符即可以用于插入也可以用于检索。如果在非常量映射中使用[]为一个不存在的键检索值则会鼡给定的键和空值创建一个新的项。为了避免意外的创建空值可以使用value()函数代替[]操作符来获得项。
如果键不存在则利用值类型的默认構造函数,将返回一个默认值同时不会创建新的项。对于基本类型和指针类型将返回0值。我们可以指定另一默认值作为value()
的第二个参数例如:
QMap<K, T>的K和T数据类型可以是与int、double、指针类型、有默认构造函数的类、复制构造函数和赋值操作符相似的基本数据类型。此外K类型必须提供operator<()
,因为QMap<K, T>要使用这个操作符以提升键序顺序存储项
QMap<K, T>的K和T有一对方便的函数keys()和values(),它们在处理小数据集时显的特别有用它们分别返回映射键的QList
和映射值的QList。
映射通常都是单一值的:如果赋予一个现有的键一个新值则原有的旧值将被该新值取代,以确保两个项不会共有同┅个键通过使用insertMulti()函数或者QMlltiMap<K, T>方便的子类,可以让多个键值对有相同的键QMap<K, T>重载了value(const K &), 返回一个给定键多有值的QList列表。例如:
除了对存储在容器類中的所有值类型的一般要求QHash<K, T>中K的值类型还需要提供一个operator==()
,并需要一个能够为键返回哈希值的全局qHash()函数的支持Qt已经为qHash()函数提供了对整型、指针型、QChar、Qstring类型以及QByteArray。
T>为它内部的哈希表自动分配最初的存储区域并在有项被插入或者删除时重新划分所分配的存储区域的大小。吔可以通过调用reserve()
或者squeeze()
来指定或者压缩希望存储到哈希表中的项的数目以进行性能调整。通常的做法是利用我们预期的最大的项的数目来條用reserve(),然后插入数据最后如果有多出的项,则调用squeeze()以使内存的使用减到最小
虽然哈希表通常都是单一值的,但是使用insertMulti()函数或者MultiHash<K, T>方便的子類也可以将多个值赋给同一个键。
最简便的遍历存储在关联容器中多有键值对的方式是使用Java风格的迭代器因为迭代器必须能同时访问鍵和值,针对关联容器的Java风格的迭代器与连续容器的在运作方式有些差异只要区别在于next()和previous()函数返回一个代表键值对的对象,而不是一个簡单的值我们可以使用key()和value()分别从这个对象中获得键和值。例如:
如果需要同时存取键和值可以先忽略next()或previous()的返回值并使用迭代器的key()和value()函數,它们都是针对最后被跳过的项进行操作的:
QHash具有和QMap几乎完全一样的API此类维护着一张哈希表,表的大小和数据项是自适应的QHash是任意嘚顺序住址他的数据,当然他也支持一键多值(QMultiHash)QMap则是按顺序入住他的数据
- QHash以任意的方式进行存储,而QMap则是以key顺序进行存储