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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt学习之路(35): Qt容器类之顺序存储容器

發布時間:2025/5/22 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt学习之路(35): Qt容器类之顺序存储容器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章?原始出處?、作者信息和本聲明。否則將追究法律責任。http://devbean.blog.51cto.com/448512/245988

本來計劃先來說下model/view的,結果發現model/view涉及到一些關于容器的內容,于是就把容器部分提前了。

?

容器Containers,有時候也被稱為集合collections,指的是能夠在內存中存儲其他特定類型的對象的對象,這種對象一般是通用的模板類。C++提供了一套完整的解決方案,成為標準模板庫Standard Template Library,也就是我們常說的STL。

?

Qt提供了它自己的一套容器類,這就是說,在Qt的應用程序中,我們可以使用標準C++的STL,也可以使用Qt的容器類。Qt容器類的好處在于,它提供了平臺無關的行為,以及隱式數據共享技術。所謂平臺無關,即Qt容器類不因編譯器的不同而具有不同的實現;所謂“隱式數據共享”,也可以稱作“寫時復制copy on write”,這種技術允許在容器類中使用傳值參數,而不會發生額外的性能損失。Qt容器類提供了類似Java的遍歷器語法,同樣也提供了類似STL的遍歷器語法,以方便用戶選擇自己習慣的編碼方式。最后一點,在一些嵌入式平臺,STL往往是不可用的,這時你就只能使用Qt提供的容器類,除非你想自己創建。

?

今天我們要說的是“順序儲存容器”。所謂順序存儲,就是它存儲數據的方式是一個接一個的,線性的。

?

第一個順序存儲容器是QVector<T>,即向量。QVector<T>是一個類似數組的容器,它將數據存儲在連續內存區域。同C++數組不同之處在于,QVector<T>知道它自己的長度,并且可以改變大小。對于獲取隨機位置的數據,或者是在末尾處添加數據,QVector<T>的效率都是很高的,但是,在中間位置插入數據或者刪除數據,它的效率并不是很高。在內存中QVector<T>的存儲類似下圖(出自C++ GUI Programming with Qt4, 2nd Edition):

?

同STL的vector<T>類類似,QVector<T>也提供了[]的重載,我們可以使用[]賦值:

?

QVector<double> v(2);?
v[0] = 1.1;?
v[1] = 1.2;

?

如果實現不知道vector的長度,可以創建一個空參數的vector,然后使用append()函數添加數據:

?

QVector<double> v;?
v.append(1.1);?
v.append(1.2);

?

在QVector<T>類中,<<也被重載,因此,我們也可以直接使用<<操作符:

?

QVector<double> v;?
v << 1.1 << 1.2;

?

注意,如果QVector<T>中的數據沒有被顯式地賦值,那么,數據項將使用加入類的默認構造函數進行初始化,如果是基本數據類型和指針,則初始化為0.

?

QLinekdList<T>是另外一種順序存儲容器。在數據結構中,這是一個鏈表,使用指針連接起所有數據。它的內存分布如下(出自C++ GUI Programming with Qt4, 2nd Edition):

正如數據結構中所描述的那樣,QLinkedList<T>的優點是數據的插入和刪除很快,但是隨機位置值的訪問會很慢。與QVector<T>不同,QLinkedList<T>并沒有提供重載的[]操作符,你只能使用append()函數,或者<<操作符進行數據的添加,或者你也可以使用遍歷器,這個我們將在后面內容中詳細描述。

?

QList<T>是一個同時擁有QVector<T>和QLinkedList<T>的大多數有點的順序存儲容器類。它像QVector<T>一樣支持快速的隨機訪問,重載了[]操作符,提供了索引訪問的方式;它像QLinkedList<T>一樣,支持快速的添加、刪除操作。除非我們需要進行在很大的集合的中間位置的添加、刪除操作,或者是需要所有元素在內存中必須連續存儲,否則我們應該一直使用Qlist<T>。

?

QList<T>有幾個特殊的情況。一個是QStringList,這是QList<QString>的子類,提供針對QString的很多特殊操作。QStack<T>和QQueue<T>分別實現了數據結構中的堆棧和隊列,前者具有push(), pop(), top()函數,后者具有enqueue(), dequeue(), head()函數。具體情況請查閱API文檔。

?

另外需要指出的一點是,我們所說的模板類中的占位符T,可以使基本數據類型,比如int,double等,也可以指針類型,可以是類類型。如果是類類型的話,必須提供默認構造函數,拷貝構造函數和賦值操作符。Qt的內置類中的QByteArray,QDateTime,QRegExp,QString和QVariant是滿足這些條件的。但是,QObject的子類并不符合這些條件,因為它們通常缺少拷貝構造函數和賦值操作符。不過這并不是一個問題,因為我們可以存儲QObject的指針,而不是直接存儲值。T也可以是一個容器,例如:

?

QList<QVector<int> > list;

?

注意,在最后兩個>之間有一個空格,這是為了防止編譯器把它解析成>>操作符。這個空格是必不可少的,切記切記!

?

下面我們來看一個類(出自C++ GUI Programming with Qt4, 2nd Edition):

?

class?Movie?
{?
public:?
????????Movie(const?QString &title = "",?int?duration = 0);?
?
????????void?setTitle(const?QString &title) { myTitle = title; }?
????????QString title()?const?{?return?myTitle; }?
????????void?setDuration(int?duration) { myDuration = duration; }?
????????QString duration()?const?{?return?myDuration; }?
?
private:?
????????QString myTitle;?
????????int?myDuration;?
};

?

我們能不能把這個類放進Qt容器類呢?答案是肯定的。下面我們來對照著前面所說的要求:第一,雖然這個類的構造函數有兩個參數,但是這兩個參數都有默認值,因此,像Movie()這種寫法是允許的,所以,它有默認構造函數;第二,這個類表面上看上去沒有拷貝構造函數和賦值操作符,但是C++編譯器會為我們提供一個默認的實現,因此這個條件也是滿足的。對于這個類而言,默認拷貝構造函數已經足夠,無需我們自己定義。所以,我們可以放心的把這個類放進Qt的容器類。

本文出自 “豆子空間” 博客,請務必保留此出處http://devbean.blog.51cto.com/448512/245988


轉載于:https://blog.51cto.com/376133/1787054

總結

以上是生活随笔為你收集整理的Qt学习之路(35): Qt容器类之顺序存储容器的全部內容,希望文章能夠幫你解決所遇到的問題。

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