集合類是用來容納和處理一組對象或標準資料類型變數的C++類。每個集合類對象可以看作一個單獨的對象。類成員函數可作用於集合的所有元素。MFC提供兩種類型的集合類:
基於模板的集合類
非基於模板的集合類
這兩種集合類 對使用者來說非常相似。基於模板的集合所包含的元素是使用者自訂的資料結構或者說是抽象的資料結構,它以數組、鏈表和映射表三種方式組織使用者自訂的資料結構。使用基於模板的集合類需要使用者作一些類型轉換工作。非基於 模板的集合類提供的是一組現成的、用於某種預定義的資料類型(如CObject、WORD、BYTE、DWORD、字串等)的集合。在設計程式時,如果所用的資料類型是預定義的,如下面的編輯要用到的字串,則使用非基於模板的集合類;如果所用得資料類型是使用者自訂的資料結構類型,那就要用到基於模板的集合類。
根據對象在集合中的組織合儲存方式,集合類又可分為三種類型:鏈表、數組、映射(或字典)。應當根據特定的編程問題,選擇適當的類型。
鏈表:鏈表類用雙向鏈表實現有序的、非索引的元素鏈表。鏈表有一個頭或尾。很容易從頭或尾增加或刪除元素、遍曆所有元素,在中間插入或刪除元素。鏈表在需要增加、刪除元素的場合效率很高。非基於模板的鏈表有三種:CObList、CPtrList、CStringList,分別用於管理對象指標、無類型指標和字串。可以使用鏈表建立堆棧和隊列。
要訪問鏈表的成員,可以使用GetNext和GetHeadPosition()。
要刪除鏈表的成員,可以用GetHeadPosition()和GetNext()來遍曆鏈表,然後用delete刪除其中的對象,最後調用RemoveAll刪除鏈表所包含的指標。
數組類提供一個可動態調整數組大小的、有序的、按整數索引的對象數組。數組在記憶體中連續的存放固定長度的數組元素。數組的最大優點是可以隨時存取任一元素。數組類包括基於模板的CArray,它可以存放任何類型的資料;MFC還為位元組、字、雙字、CString對象、CObject指標和無類型指標提供了預定義的類。數組的元素可以通過一個以零為基礎的整數下標直接進行訪問。下標操作符([])可用於設定或檢取數組元素。如果要設定一個超過數組當前範圍的元素,可以指定該數組是否自動增大。但是如果要調整數組大小時,則數組佔用的記憶體塊需要重新移動,效率很低。如果不要求調整數組大小,則對數組集合的訪問和對標準C數組的訪問一樣快。在使用數組之前,應使用SetSize建立其大小,並分配記憶體。若不用SetSize,象數組添加元素時會導致頻繁的再分配記憶體和拷貝資料。數組類適用於那些需要快速檢索、很少需要增加或刪除元素的集合。
數組通過GetAt(索引值)來訪問數組中的成員。
要刪除數組中的成員,可以用GetSize()取得大小,然後遍曆數組中成員,用delete刪除,然後調用RemoveAll()清除其中的指標資料。
下面是使用數組模板類的例子:
CArray<CMyClass,CMyClass&> myArray;
CMyClass myClass;
myArray->Add(myClass);
映射類以一種字典的方式組織資料。每個元素由一個關鍵字和一個數值項組成,關鍵字用作數值項的標識符,在集合中不允許重複,必須是唯一的。如果給出一個關鍵字,映射類會很快找到對應的數值項。映射尋找是以雜湊表的方式進行的,因此在映射中尋找數值項的速度很快。除了映射類模板外,預定義的映射類能支援CString對象、字、CObject指標和無類型指標。比如,CMapWordToOb類建立一個映射表對象後,就可以用WORD類型的變數作為關鍵字來尋找對應的CObject指標。映射類最適用於需要根據關鍵字進行快速檢索的場合。
要訪問映射中的資料,可以用GetStartPosition()定位到開始處,再用GetNextAssoc訪問映射表中的成員。
要刪除映射中的資料,可以用GetStartPosition和GetNextAssoc遍曆並用delete刪除對象,然後調用RemoveAll。
下面是使用CMap模板類的例子:
CMap<CString,LPCSTR,CPerson,CPerson&> myMap;
CPerson person;
LPCSTR lpstrName=“Tom”;
myMap->SetAt(lpstrName,person);
有關集合類的使用可以參見MFC的例子COLLECT。