天天看點

Qt核心程式設計___集合類

QT核心程式設計之集合類是本篇要介紹的内容。QT核心程式設計我們要分幾個部分來介紹,想參考更多内容,請看末尾的編輯推薦進行詳細閱讀,先來看本篇内容。

一個集合類是裝有多個條目的容器,每個條目是某種資料結構,集合類能執行對容器中的條目的插入、删除及查找等操作。

Qt有幾個基于值和基于指針的集合類。基于指針的集合類使用指向條目的指針來工作,而基于值的集合類存儲着它們條目的拷貝。基于值的集合類類似于STL容器類,能和STL算法和容器一起使用。

基于值的集合類說明如表4所示:

Qt核心程式設計___集合類

表4 基于值的集合類表

基于指針的集合類說明如表5所示:

Qt核心程式設計___集合類

表5 基于指針的集合類表

QMemArray 是一個例外,它既不是基于指針也不是基于值,而是基于記憶體的結構。用于在有簡單資料結構的數組中使用QMemArray效率最高,QMemArray在拷貝和數組元素比較時使用位邏輯運算符操作。

這些類中有一些具有疊代器,疊代器是周遊集合類中的條目的類。在Qt模闆庫裡,基于值的集合和算法內建在一起。下面讨論基于指針的容器。

1、基于指針的容器的結構

基于指針的容器有4個内部基類(QGCache, QGDict, QGList和QGVector)操作void類型指針。通過增加/删除條目指針,一個由這4個類組成的薄模闆層實作了實際的集合。

允許Qt的模闆類的政策使得在空間上很經濟(實作這些模闆類僅增加了對基類的内聯調用),而且還不影響執行效率。

示例:QPtrList使用

下面的例子說明了如何存儲Employee條目到一個連結清單,并将它們以相反的次序列印出來。

#include <qptrlist.h>

#include <qstring.h>

#include <stdio.h>

class Employee{public: Employee( const char *name, int salary ) {

n=name; s=salary;

}

const char *name() const {

return n;

int salary() const {

return s;

private: QString n;

int s;

};

int main(){

QPtrList<Employee> list; // 指向Employee的指針連結清單

list.setAutoDelete( TRUE ); //當連結清單條目被移動時,删除條目

list.append( new Employee("Bill", 50000) ); //連結清單追加新的對象

list.append( new Employee("Steve",80000) );

list.append( new Employee("Ron", 60000) );

QPtrListIterator<Employee> it(list); //周遊Employee連結清單

for ( it.toLast(); it.current(); --it) ) { //從尾向頭周遊

Employee *emp = it.current();

printf( "%s earns %d\n", emp->name(), emp->salary() );

return 0;

程式運作結果如下:

Ron earns 60000

Steve earns 80000

Bill earns 50000

2、管理集合條目

所有基于指針的集合繼承了QPtrCollection基類。這個類僅知道集合中的條目個數和删除政策。

當集合中的條目被移去時,預設時它們不被删除。QPtrCollection::setAutoDelete()定義了删除政策。在上述QPtrList使用示例子,我們激活了自動删除功能來進行連結清單删除。

當插入一個條目到一個集合時,僅指針被拷貝,而不是拷貝條目本身。這稱為淺拷貝。當插入一個條目時,拷貝所有條目的數組到集合中也是可能的,這稱為深拷貝。

所有的集合類函數在插入條目時調用虛拟函數QPtrCollection::newItem()。如果你想進行深拷貝,你需要重載它。

當從一個連結清單中移去一個條目時,調用虛拟函數QPtrCollection::deleteItem()。如果自動删除功能被激活,在所有集合類中的預設實作函數被調用來删除條目。

基于指針的集合類,如:QPtrList<type>,定義了指向對象的指針集合。我們在這裡隻讨論QPtrList類,其它的基于指針的集合類和所有集合類疊代器都有同樣的使用方法。

模闆執行個體化方法如下:

QPtrList<Employee> list;

在這個例子中,條目的類或類型是Employee,它必須在連結清單定義之前被定義。例如:

class Employee { ...};

3、疊代器(Iterators)

QPtrListIterator能在連結清單被修改的同時非常安全的周遊連結清單。在同一個集合上,多個疊代器能獨立地工作。

QPtrList有一個指向所有疊代器的内部連結清單,這些疊代器目前操作連結清單。當一個連結清單條目被移去時,連結清單更新所有的指向這個條目的疊代器。

QDict和QCache集合沒有周遊函數。為了周遊集合,你必須使用QDictIterator或 QCacheIterator。

Qt預定義的集合類有字元串連結清單:QStrList, QStrIList (在qstrlist.h中)和 QStringList (在qstringlist.h中)。在絕大多數情況下你将選擇QStringList,它是一個共享的QString Unicode字元串的值連結清單。QPtrStrList和 QPtrStrIList僅存儲字元指針,而不是字元串本身。

基于指針的集合類和相關的疊代器類說明如表4。

Qt核心程式設計___集合類

表4 基于指針的集合類和相關的疊代器類清單

本文轉自夜&楓部落格園部落格,原文連結:http://www.cnblogs.com/newstart/archive/2013/06/14/3136018.html,如需轉載請自行聯系原作者

繼續閱讀