VC里的集合类、链表类、映射类
集合類(lèi)是用來(lái)容納和處理一組對(duì)象或標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型變量的C++類(lèi)。每個(gè)集合類(lèi)對(duì)象可以看作一個(gè)單獨(dú)的對(duì)象。類(lèi)成員函數(shù)可作用于集合的所有元素。MFC提供兩種類(lèi)型的集合類(lèi):
基于模板的集合類(lèi)、非基于模板的集合類(lèi)。
這兩種集合類(lèi)對(duì)用戶(hù)來(lái)說(shuō)非常相似?;谀0宓募纤脑厥怯脩?hù)自定義的數(shù)據(jù)結(jié)構(gòu)或者說(shuō)是抽象的數(shù)據(jù)結(jié)構(gòu),它以數(shù)組、鏈表和映射表三種方式組織用戶(hù)自定義的數(shù)據(jù)結(jié)構(gòu)。使用基于模板的集合類(lèi)需要用戶(hù)作一些類(lèi)型轉(zhuǎn)換工作。非基于模板的集合類(lèi)提供的是一組現(xiàn)成的、用于某種預(yù)定義的數(shù)據(jù)類(lèi)型(如CObject、WORD、BYTE、DWORD、字符串等)的集合。在設(shè)計(jì)程序時(shí),如果所用的數(shù)據(jù)類(lèi)型是預(yù)定義的,如下面的編輯要用到的字符串,則使用非基于模板的集合類(lèi);如果所用得數(shù)據(jù)類(lèi)型是用戶(hù)自定義的數(shù)據(jù)結(jié)構(gòu)類(lèi)型,那就要用到基于模板的集合類(lèi)。
根據(jù)對(duì)象在集合中的組織合存儲(chǔ)方式,集合類(lèi)又可分為三種類(lèi)型:鏈表、數(shù)組、映射(或字典)。應(yīng)當(dāng)根據(jù)特定的編程問(wèn)題,選擇適當(dāng)?shù)念?lèi)型。
鏈表
鏈表類(lèi)用雙向鏈表實(shí)現(xiàn)有序的、非索引的元素鏈表。鏈表有一個(gè)頭或尾。很容易從頭或尾增加或刪除元素、遍歷所有元素,在中間插入或刪除元素。鏈表在需要增加、刪除元素的場(chǎng)合效率很高。非基于模板的鏈表有三種:CObList、CPtrList、CStringList,分別用于管理對(duì)象指針、無(wú)類(lèi)型指針和字符串??梢允褂面湵韯?chuàng)建堆棧和隊(duì)列。
要訪問(wèn)鏈表的成員,可以使用GetNext和GetHeadPosition()。
要?jiǎng)h除鏈表的成員,可以用GetHeadPosition()和GetNext()來(lái)遍歷鏈表,然后用delete刪除其中的對(duì)象,最后調(diào)用RemoveAll刪除鏈表所包含的指針。
數(shù)組
數(shù)組類(lèi)提供一個(gè)可動(dòng)態(tài)調(diào)整數(shù)組大小的、有序的、按整數(shù)索引的對(duì)象數(shù)組。
數(shù)組在內(nèi)存中連續(xù)的存放固定長(zhǎng)度的數(shù)組元素。數(shù)組的最大優(yōu)點(diǎn)是可以隨時(shí)存取任一元素。數(shù)組類(lèi)包括基于模板的CArray,它可以存放任何類(lèi)型的數(shù)據(jù);MFC還為字節(jié)、字、雙字、CString對(duì)象、CObject指針和無(wú)類(lèi)型指針提供了預(yù)定義的類(lèi)。數(shù)組的元素可以通過(guò)一個(gè)以零為基礎(chǔ)的整數(shù)下標(biāo)直接進(jìn)行訪問(wèn)。下標(biāo)操作符([])可用于設(shè)置或檢取數(shù)組元素。
如果要設(shè)置一個(gè)超過(guò)數(shù)組當(dāng)前范圍的元素,可以指定該數(shù)組是否自動(dòng)增大。但是如果要調(diào)整數(shù)組大小時(shí),則數(shù)組占用的內(nèi)存塊需要重新移動(dòng),效率很低。如果不要求調(diào)整數(shù)組大小,則對(duì)數(shù)組集合的訪問(wèn)和對(duì)標(biāo)準(zhǔn)C數(shù)組的訪問(wèn)一樣快。
在使用數(shù)組之前,應(yīng)使用SetSize建立其大小,并分配內(nèi)存。若不用SetSize,象數(shù)組添加元素時(shí)會(huì)導(dǎo)致頻繁的再分配內(nèi)存和拷貝數(shù)據(jù)。
數(shù)組類(lèi)適用于那些需要快速檢索、很少需要增加或刪除元素的集合。
數(shù)組通過(guò)GetAt(索引值)來(lái)訪問(wèn)數(shù)組中的成員。
要?jiǎng)h除數(shù)組中的成員,可以用GetSize()取得大小,然后遍歷數(shù)組中成員,用delete刪除,然后調(diào)用RemoveAll()清除其中的指針數(shù)據(jù)。
下面是使用數(shù)組模板類(lèi)的例子:
CArray<CMyClass,CMyClass&> myArray;
CMyClass myClass;
myArray->Add(myClass);
映射
映射類(lèi)以一種字典的方式組織數(shù)據(jù)。每個(gè)元素由一個(gè)關(guān)鍵字和一個(gè)數(shù)值項(xiàng)組成,關(guān)鍵字用作數(shù)值項(xiàng)的標(biāo)識(shí)符,在集合中不允許重復(fù),必須是唯一的。如果給出一個(gè)關(guān)鍵字,映射類(lèi)會(huì)很快找到對(duì)應(yīng)的數(shù)值項(xiàng)。映射查找是以哈希表的方式進(jìn)行的,因此在映射中查找數(shù)值項(xiàng)的速度很快。除了映射類(lèi)模板外,預(yù)定義的映射類(lèi)能支持CString對(duì)象、字、CObject指針和無(wú)類(lèi)型指針。比如,CMapWordToOb類(lèi)創(chuàng)建一個(gè)映射表對(duì)象后,就可以用WORD類(lèi)型的變量作為關(guān)鍵字來(lái)尋找對(duì)應(yīng)的CObject指針。映射類(lèi)最適用于需要根據(jù)關(guān)鍵字進(jìn)行快速檢索的場(chǎng)合。
要訪問(wèn)映射中的數(shù)據(jù),可以用GetStartPosition()定位到開(kāi)始處,再用GetNextAssoc訪問(wèn)映射表中的成員。
要?jiǎng)h除映射中的數(shù)據(jù),可以用GetStartPosition和GetNextAssoc遍歷并用delete刪除對(duì)象,然后調(diào)用RemoveAll。
下面是使用CMap模板類(lèi)的例子:
CMap<CString,LPCSTR,CPerson,CPerson&> myMap;
CPerson person;
LPCSTR lpstrName=“Tom”;
myMap->SetAt(lpstrName,person);
有關(guān)集合類(lèi)的使用可以參見(jiàn)MFC的例子COLLECT。
總結(jié)
以上是生活随笔為你收集整理的VC里的集合类、链表类、映射类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MFC中的GDI绘图
- 下一篇: MFC提供的集合类CStringArra