Qt 容器

Qt 的容器類是一種值類型(能夠被復(fù)制的事物)的集合,包括指向?qū)ο箢愋偷闹羔槪ǖ话▽ο箢愋停t 容器被定義成模版類,這樣就使得它所包含的類型是未指定的。每一種數(shù)據(jù)結(jié)構(gòu)都針對不同種類的操作進(jìn)行了優(yōu)化。在 Qt 中,有以下模版容器可供選擇。

  1. QList<T> 使用數(shù)組實(shí)現(xiàn)的,數(shù)組的兩端都有預(yù)分配的空間。它針對按索引的隨機(jī)訪問以及少于 1000 項(xiàng)的列表進(jìn)行了優(yōu)化。對于 prepend() 和 appand() 這樣的操作,它也有很好的性能表現(xiàn)。

  2. QStringList 是派生自 QList<QString> 的一個(gè)便利類。

  3. QLinkedList<T> 針對迭代器的順序訪問以及快速、常量時(shí)間的列表插入操作進(jìn)行了優(yōu)化,但排序和索引比較慢。它提供多個(gè)便利函數(shù)來處理那些經(jīng)常用到的操作。

  4. QVector<T> 以連續(xù)的內(nèi)存位置保存數(shù)據(jù),并針對按索引的隨機(jī)訪問進(jìn)行了優(yōu)化。通常而言,QVector 對象都是用其初始大小進(jìn)行構(gòu)造的,在其兩端都不存在預(yù)先自動(dòng)分配的內(nèi)存空間,所以中間插入、末端插入以及前段插入都是耗時(shí)的。

  5. QStack<T> 是派生自 QVector<T> 的 public 類,所以 QVector 類的 public 接口可以用于 QStack 對象。不過,push() ,pop() 以及 top() 函數(shù)采用的是后入先出的(LIFO)語法。

  6. 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==()。

  7. QHash<Key,T> 也是一個(gè)關(guān)聯(lián)容器,它使用哈希表來進(jìn)行鍵的查找。它提供快速的查找(鍵精確匹配)和插入操作,但其搜索速度較慢,且沒有排序功能。鍵的類型必須實(shí)現(xiàn) operator==()。

  8. QMultiMap<Key,T> 是 QMap 的一個(gè)子類,而 QMultiHash<Key,T> 是 QHash 的一個(gè)子類。這兩個(gè)類使得一個(gè)鍵可以和多個(gè)值相關(guān)聯(lián)。

  9. QCache<Key,T> 是一個(gè)關(guān)聯(lián)容器,它對最近使用過的項(xiàng)提供最快速的訪問,并會(huì)根據(jù)幾個(gè)開銷函數(shù)的結(jié)果自動(dòng)移除那些不常用的項(xiàng)。

  10. 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*>。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • QT容器遍歷分為Java和STL遍歷 STL風(fēng)格遍歷器的語法類似于使用指針對數(shù)組的操作。我們可以使用++和--運(yùn)算...
    YBshone閱讀 5,228評(píng)論 0 2
  • Qt對象模型 信號(hào)和槽、對象屬性系統(tǒng)、事件和事件過濾器、國際化翻譯機(jī)制、定時(shí)器驅(qū)動(dòng)、守衛(wèi)指針(QPoint)、動(dòng)態(tài)...
    愛笑的人26閱讀 1,365評(píng)論 2 3
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,690評(píng)論 1 51
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,824評(píng)論 18 399
  • 世事翻云覆雨,正是因?yàn)槎媚愕碾y處,方能與你比肩而立,共看滄海變桑田。 人活一輩子,遇見的人太多太多,可最終真正知...
    晴云秋月AL閱讀 172評(píng)論 0 0

友情鏈接更多精彩內(nèi)容