容器(Container)

Qt 提供了一套基於模板的容器類,比C++的容器更輕量和容易使用,皆提供隱式共享進行優化,且是平台無關的,不因編譯器的不同而有不同的實現,在一些嵌入式平台,c++的容器類可能無法使用,這時就只能使用Qt提供的容器類或自己創建。

不能使用容器儲存QObject及其子類(QWidget、QTimer等),也就是像QList這種容器,如果需要這種類型的容器,只能存儲其指針,也就是QList

Qt提供兩種容器:

  • 循序式容器:QList、QLinkedList、QVector、QStack和QQueue。
  • 關聯式容器:QMap、QMultiMap、QHash、QMultiHash和QSet。

以下為各式容器的簡單介紹:

  • QList:最常用的容器類,結合了QVector與QLinkedList的優點,提供快速存取與插入、移除,並提供基於索引的存取方式。QStringList就是繼承自QList,專門用來處理字串。
  • QLinkedList:以鏈結的方式儲存項目,所以無法用整數索引進行隨機訪問,只能使用迭代器進行存取,提供快速插入及移除項目。
  • QVector:對於循序存取或使用索引效率較高,當進行中間插入或移除元素操作時,效率低落。
  • QStack:這是QVector的子類,提供了後進先出(LIFO)語義。提供額外的函數:push(),pop()和top()。
  • QQueue:這是QList的子類,提供了先進先出(FIFO)語義。提供額外的函數:enqueue(),dequeue()和head()。
  • QSet:提供單值集合,重複數據不另外儲存。
  • QMap<Key, T>:將T值和Key鍵關聯起來,一個鍵只與一個值關聯。
  • QMultiMap<Key, T>:這是QMap的子類,提供了多值映射,一個鍵可以與多個值關聯。
  • QHash<Key, T>:和QMap的介面幾乎相同,但是提供了更快的查找。
  • QMultiHash<Key, T>:這是QHash的子類,提供了多值散列。

Qt提供兩種風格的迭代器:Java風格與STL風格,Java風格的迭代器使用上相對方便,而STL風格的迭代器則效率稍高。