Qt 的容器類是一種值類型(能夠被復(fù)制的事物)的集合,包括指向?qū)ο箢愋偷闹羔槪ǖ话▽ο箢愋停t 容器被定義成模版類,這樣就使得它所包含的類型是未指定的。每一種數(shù)據(jù)結(jié)構(gòu)都針對不同種類的操作進(jìn)行了優(yōu)化。在 Qt 中,有以下模版容器可供選擇。
QList<T> 使用數(shù)組實(shí)現(xiàn)的,數(shù)組的兩端都有預(yù)分配的空間。它針對按索引的隨機(jī)訪問以及少于 1000 項(xiàng)的列表進(jìn)行了優(yōu)化。對于 prepend() 和 appand() 這樣的操作,它也有很好的性能表現(xiàn)。
QStringList 是派生自 QList<QString> 的一個(gè)便利類。
QLinkedList<T> 針對迭代器的順序訪問以及快速、常量時(shí)間的列表插入操作進(jìn)行了優(yōu)化,但排序和索引比較慢。它提供多個(gè)便利函數(shù)來處理那些經(jīng)常用到的操作。
QVector<T> 以連續(xù)的內(nèi)存位置保存數(shù)據(jù),并針對按索引的隨機(jī)訪問進(jìn)行了優(yōu)化。通常而言,QVector 對象都是用其初始大小進(jìn)行構(gòu)造的,在其兩端都不存在預(yù)先自動(dòng)分配的內(nèi)存空間,所以中間插入、末端插入以及前段插入都是耗時(shí)的。
QStack<T> 是派生自 QVector<T> 的 public 類,所以 QVector 類的 public 接口可以用于 QStack 對象。不過,push() ,pop() 以及 top() 函數(shù)采用的是后入先出的(LIFO)語法。
QMap<Key,T> 是一個(gè)有序的關(guān)聯(lián)容器(associative container),它保存的是鍵/值對,其作用是根據(jù)鍵來快速查找到對應(yīng)的值。它也被設(shè)計(jì)成支持適量的快速插入操作和刪除操作。它將鍵有序排列,以便能夠快速搜索和快速縮小搜索范圍,采用的是一個(gè)跳躍列表字典(skip-list dictionary),這個(gè)字典在概率上是平衡的并且高效地利用了內(nèi)存。鍵的類型必須實(shí)現(xiàn) operator<() 和 operator==()。
QHash<Key,T> 也是一個(gè)關(guān)聯(lián)容器,它使用哈希表來進(jìn)行鍵的查找。它提供快速的查找(鍵精確匹配)和插入操作,但其搜索速度較慢,且沒有排序功能。鍵的類型必須實(shí)現(xiàn) operator==()。
QMultiMap<Key,T> 是 QMap 的一個(gè)子類,而 QMultiHash<Key,T> 是 QHash 的一個(gè)子類。這兩個(gè)類使得一個(gè)鍵可以和多個(gè)值相關(guān)聯(lián)。
QCache<Key,T> 是一個(gè)關(guān)聯(lián)容器,它對最近使用過的項(xiàng)提供最快速的訪問,并會(huì)根據(jù)幾個(gè)開銷函數(shù)的結(jié)果自動(dòng)移除那些不常用的項(xiàng)。
QSet<T> 用 QHash 保存 T 類型的值,QHash 中的鍵位于 T 中,而其中的啞值與每一個(gè)鍵相關(guān)聯(lián)。這種安排可優(yōu)化查找和插入操作。QSet 中的幾個(gè)函數(shù)用于常規(guī)的集合操作(例如,集合的并、交、差等)。它的默認(rèn)構(gòu)造函數(shù)會(huì)創(chuàng)建一個(gè)空集合。
用于模版容器類的類型參數(shù) T,或者用于關(guān)聯(lián)容器的鍵值類型,都必須為可賦值數(shù)據(jù)類型。這意味著 T 必須具有 public 類型的默認(rèn)構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符。
基本類(例如,int,double,char等)和指針都是可賦值的。有些 Qt 類型是可賦值的(例如,QString,QDate,QTime)。QObject 以及派生自 QObject 的類型都是不可賦值的。如果需要使用某種不可賦值類型的對象,則可以定義一個(gè)指針容器,比如 QList<QFile*>。