日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT学习:容器类及QVariant类

發布時間:2024/9/30 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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只讀遍歷方法。

#include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QList<int> list;list<<1<<2<<3<<4<<5;QListIterator<int> i(list);for(;i.hasNext();)qDebug()<<i.next();return a.exec(); }

以上是對列表進行前向遍歷,后向遍歷的函數有:
QListIterator<T>::toBack():將迭代點移動到最后一個列表項的后面。
QListIterator<T>::hasPrevious():檢查當前迭代點之前是否具有列表項。
QListIterator<T>::Previous():返回前個列表項的內容并將迭代點移動到前一個列表項之前。
(2) QListIterator<T> 是只讀迭代器,它不能完成列表項的插入和刪除操作。讀寫迭代器QMutableListIterator<T>除提供基本的遍歷操作外,還提供了insert()插入,remove()刪除操作函數和修改數據函數等。
以下代碼為QList讀寫操作:

#include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QList<int> list;QMutableListIterator<int> i(list);for(int j=0;j<10;++j)i.insert(j);for(i.toFront();i.hasNext();)qDebug()<<i.next();for(i.toBack();i.hasPrevious();){if(i.previous()%2==0)i.remove();elsei.setValue(i.peekNext()*10);}for(i.toFront();i.hasNext();)qDebug()<<i.next();return a.exec(); }

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中的插入、遍歷和修改,如下代碼:

#include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QMap<QString,QString> map; //創建一個QMap棧對象//向棧對象插入<城市,區號>對map.insert("beijing","111");map.insert("shanghai","021");map.insert("nanjing","025");QMapIterator<QString,QString> i(map); //創建一個只讀迭代器for(;i.hasNext();) qDebug()<<" "<<i.key()<<" "<<i.next().value();QMutableMapIterator<QString,QString> mi(map);if(mi.findNext("111")) mi.setValue("010");QMapIterator<QString,QString> modi(map);qDebug()<<" ";for(;modi.hasNext();) //再次遍歷并輸出修改后的結果qDebug()<<" "<<modi.key()<<" "<<modi.next().value();return a.exec(); }

4、STL風格迭代器遍歷容器

STL風格迭代器的兩種分類如下圖所示:

三、QVariant類

QVariant類類似于C++的聯合(union) 數據類型,它不僅能保存很多Qt 類型的值,包括QColor、QBrush、 QFont、QPen、QRect、QString 和QSize等,而且也能存放Qt的容器類型的值。Qt的很多功能都是建立在QVariant基礎上的,如Qt的對象屬性及數據庫功能等。
下面我們用一個例子介紹這個類的具體用法:

#include "widget.h" #include <QDebug> #include <QVariant> #include <QColor> Widget::Widget(QWidget *parent): QWidget(parent) {QVariant v(709); //聲明QVariant變量vqDebug()<<v.toInt(); //將變量包含的內容轉換為整數并輸出QVariant w("How are you! "); //聲明一個QVariant變量wqDebug()<<w.toString(); //將w包含的內容轉換為字符串并輸出QMap<QString,QVariant>map; map["int"]=709; //輸入整數型map["double"]=709.709; //輸入浮點型map["string"]="How are you! "; //輸入字符串map["color"]=QColor(255,0,0); //輸入QColor類型的值//調用相應的轉換函數并輸出qDebug()<<map["int"]<< map["int"].toInt();qDebug()<<map["double"]<< map["double"].toDouble();qDebug()<<map["string"]<< map["string"].toString();qDebug()<<map["color"]<< map["color"].value<QColor>(); QStringList sl; //創建一個字符串列表sl<<"A"<<"B"<<"C"<<"D";QVariant slv(sl); //將該列表保存在一個QVariant變量中if(slv.type()==QVariant::StringList){QStringList list=slv.toStringList();for(int i=0;i<list.size();++i)qDebug()<<list.at(i); //輸出列表內容}}Widget::~Widget() {}

總結

以上是生活随笔為你收集整理的QT学习:容器类及QVariant类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。