QT学习:容器类及QVariant类
Qt提供了一組通用的基 于模板的容器類。對比C++的標準模板庫中的容器類,Qt 的這些容器更輕量、更安全并且更容易使用。
存儲在Qt容器中的數據必須是可賦值的數據類型,也就是說,這種數據類型必須提供一個默認的構造函數(不需要參數的構造函數)、一個復制構造函數和一個賦值操作運算符。
這樣的數據類型包含了通常使用的大多數數據類型,包括基本數據類型(如int和double等)和Qt的一些數據類型(如QString、 QDate和QTime等)。不過,Qt的QObject及其他的子類(如QWidget和Qdialog等)是不能夠存儲在容器中的,一個可代替的方案是存儲QObject及其子類的指針。
此外Qt的容器類也是可以嵌套的。
Qt的容器類位遍歷其中的內容提供了兩種方法,一種是Java風格的迭代器,另一種是STL風格的迭代器。
一、QList類、QLinkedList類、QVector類
下圖為這三個類的時間復雜度比較:
1、QList類
QList<T>是迄今為止最常用的容器類,它存儲給定數據類型T的一列數值。 繼承自QList類的子類有QltemSelection.、QQueue、 QSigalspy、 QStringList 和QTestEventList。
常用的函數有:
QList::append()、QList::prepend():在列表中進行追加。
QList::insert()函數:在列表中進行插入。
QList<T>維護了一個指針數組,該數組存儲的指針指QList<T>存儲的列表項的內容。因此,QList<T>提供了基于下標的快速訪問。
對于不同的數據類型,QList<T> 采取不同的存儲策略,存儲策略有以下幾種。
(1)如果T是一個指針類型或指針大小的基本類型,QList<T> 會將數值直接存儲在它的數組中。
(2)如果QList<T>存儲對象的指針。則該指針指向實際存儲的對象。
2、QLinkedList類
QLinkedList<T>是一個鏈式列表,它以非連續的內存塊保存數據。
QLinkedList<T>不能使用下標,只能使用迭代器訪問它的數據項。與QList相比,當對一個很大的列表進行插入操作時,QLinkedList 具有更高的效率。
3、QVector類
QVector<T>在相鄰的內存中存儲給定數據類型T的一組數值。在一個QVector的前部或者中間位置進行插入操作的速度是很慢的,這是因為這樣的操作將導致內存中的大量數據被移動,這是由QVector存儲數據的方式決定的。
QVector<T>既可以使用下標訪問數據項,也可以使用迭代器訪問數據項。繼承自QVector類的子類有QPolygon、QPolygonF 和QStack。
4、Java風格迭代器遍歷容器
下圖是兩種類型的 Java風格迭代器數據類型
Java風格迭代器的迭代點 位于列表項的中間,而不是直接指向某個列表項。因此,它的迭代點或者在第一個列表項的前面,或者在兩個列表項之間,或者在最后一個列表項之后。
下面以QList為例,介紹兩種Java風格迭代器的用法。QLinkedlist 和QVector具有與QList相同的遍歷接口,在此不再詳細講解。
(1) QList只讀遍歷方法。
以上是對列表進行前向遍歷,后向遍歷的函數有:
QListIterator<T>::toBack():將迭代點移動到最后一個列表項的后面。
QListIterator<T>::hasPrevious():檢查當前迭代點之前是否具有列表項。
QListIterator<T>::Previous():返回前個列表項的內容并將迭代點移動到前一個列表項之前。
(2) QListIterator<T> 是只讀迭代器,它不能完成列表項的插入和刪除操作。讀寫迭代器QMutableListIterator<T>除提供基本的遍歷操作外,還提供了insert()插入,remove()刪除操作函數和修改數據函數等。
以下代碼為QList讀寫操作:
5、STL風格迭代器遍歷容器
STL風格迭代器的兩種分類如下圖所示:
二、QMap類和QHash類
QMap類和QHash類具有非常類似的功能,它們的差別僅在于:
QHash具有比QMap更快的查找速度;
QHash以任意的順序存儲數據項,而QMap總是按照鍵(Key的順序存儲數據;
QHash的鍵類型Key必須提供operator==()和一個全局的qHash(Key)函數,而QMap的鍵類型Key必須提供operator<()函數。
QMap和QHash的時間復雜圖如圖:
1、QMap類
QMap<Key,T>提供了一個從類型為 Key的鍵到類型為T的值的映射。
通常,QMap存儲的數據形式是一個鍵對應一個值,并且按照鍵Key的順序存儲數據。為了能夠支持一鍵多值的情況,QMap提供了QMaps<Key,T>::insertMulti()和QMap<Key,T>::values()函數。存儲一鍵多值的數據時,也可以使用QMultiMap<Key,T>容器,它繼承自QMap。
2、QHash 類
QHash<Key,T>具有與QMap幾乎完全相同的API。QHash維護著一張哈希表( Hash Table),哈希表的大小與QHash的數據項的數目相適應。
QHash以任意的順序組織它的數據。當存儲數據的順序無關緊要時,建議使用QHash作為存放數據的容器。QHash也可以存儲一鍵多值形式的數據,它的子類QMultiHash<Key,T>實現了一鍵多值的語義。
3. Java 風格迭代器遍歷容器
Java風格迭代器的兩種分類如下圖所示:
下面舉一個例子,包含在QMap中的插入、遍歷和修改,如下代碼:
4、STL風格迭代器遍歷容器
STL風格迭代器的兩種分類如下圖所示:
三、QVariant類
QVariant類類似于C++的聯合(union) 數據類型,它不僅能保存很多Qt 類型的值,包括QColor、QBrush、 QFont、QPen、QRect、QString 和QSize等,而且也能存放Qt的容器類型的值。Qt的很多功能都是建立在QVariant基礎上的,如Qt的對象屬性及數據庫功能等。
下面我們用一個例子介紹這個類的具體用法:
總結
以上是生活随笔為你收集整理的QT学习:容器类及QVariant类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT学习:字符串类QString
- 下一篇: QT学习:基本对话框