長久以來,在用到集合類(collection)時,一般都是開啟示例collect,從中copy出其中的定義,依葫蘆畫瓢地用,從來沒有徹底的了解其原理。今天終於把相關的msdn文件細讀了一遍。
從功能上分,集合類又分為array,list和map。array和list其實都屬於同一類,都是一種順序儲存方式,而array類似於陣列,因此是從實現機制上看,mfc中的集合類總體分為兩大類,基於模板的(template-based classes)和不基於模板的。其中非模板類是在mfc v1.0中引入的,現在保留是為了相容問題。基於陣列下標建立索引,而list則沒有順序。這兩種訪問速度都比較慢,但是適用於有重複元素的應用。map是基於hash表的原理,在關鍵字和儲存物件
間建立直接索引,根據key可以直接定位元素,因此訪問速度非常快,但鍵值不允許重複。
首先要講清楚兩個定義或說明方式,下面帶ptr的類,一般說明其儲存的是物件的指標,而沒有帶的說明是儲存的普通物件。
應用非模板類的乙個典型問題是型別安全(type-safe),即保證儲存的物件(object)的型別必須是確定的或者是其衍生類。保證型別安全有兩種方法:一是進行顯示的型別轉換,如下例:
另外一種方法是繼承或者擴充套件乙個非模板型別安全的集合類。
使用方法:
carray和clist,定義主要包括兩個引數,乙個是型別type,另外乙個是引數型別arg_type,例如:
carraymyarray;
clistmylist;
其中引數一,如上面int, cperson指定儲存物件的型別,而類的一些成員函式,如add帶的引數則由第二個引數指定,例如:
cmap的使用稍微複雜一點,其定義包括四個引數:key, arg_key, value
, and arg_value,
分別對應
主鍵的型別,引數
主鍵型別,儲存物件型別,儲存物件引數值。
其中,key和arg_key的關係通常是,
cmap< int, int, my_struct, my_struct& > mymap1;
cmap< cstring, lpcstr, cperson, cperson& > mymap2;cmapmyschool;
而value和arg_value的關係則相對簡單,後者就是對前者的引用,如上面所描述的。
這一類在使用之前必須指定其繼承性,即從哪乙個非模板類(cptrlist, cptrarray)繼承而來。使用方法:
這一類集合類的使用比較複雜一點,在定義時,必須注意兩點:
你儲存的資料型別;我們還是分兩部分講解:集合申明時使用的引數。
對於ctypedptrarray和ctypedptrlist,帶有兩個引數:
template< class base_class, class type
>
class ctypedptrarray : public base_class其中base_class定義儲存指標的非模板集合類,而type指明你要在集合中儲存的資料型別,例:
ctypedptrarraymyarray;
ctypedptrlistmylist;
定義的這兩個模板類即可以使用其繼承物件的方法,即cobarray,cptrlist的方法,也可以使用其自身的一些type-safe函式,如gethead,gettail,removehead,removetail,getnext,getprev, andgetat.
注意,對於ctypedptrmap的使用,其又可以分為以下幾類:上面只是定義兩種新的資料型別,要在實際程式中使用,必須再定義該模板型別的變數,如:
myarray myarrary1;
所有的都包含三個引數: base_class , key , and value, 即與上面的ctypedptrarray和ctypedptrlist相比,多了乙個value。
ctypedptrmapmyobjectmap;
MFC集合類之CList
之前我們先以cstringlist為例演示下列成員方法 addtail,addhead,getheadposition,gettailposition,getprev getnext 我們看到如何向乙個clist類中增加資料 可以從兩端增加,以及如何遍歷整個clist cpp view plain ...
集合類之 collection (一)
集合類 動態的物件陣列 兩大核心介面 collection map 本篇部落格主要介紹 collection 介面 1 定義 2 此介面的兩大子介面 常用方法 get int index 根據索引取得元素 set int index e element 修改指定索引內容,返回修改之前內容 三實現類 ...
MFC架構之CWinApp類
1.成員變數 2.常用全域性函式 3.可過載函式 4.命令處理 onfilenew 實現id file new命令 onfileopen 實現id file new命令 onfileprintsetup 實現id file print setup命令 oncontexthelp 處理應用程式內的sh...