MFC之集合類(一)

2021-04-30 13:03:03 字數 2463 閱讀 4616

長久以來,在用到集合類(collection)時,一般都是開啟示例collect,從中copy出其中的定義,依葫蘆畫瓢地用,從來沒有徹底的了解其原理。今天終於把相關的msdn文件細讀了一遍。

從功能上分,集合類又分為array,list和map。array和list其實都屬於同一類,都是一種順序儲存方式,而array類似於陣列,因此是

基於陣列下標建立索引,而list則沒有順序。這兩種訪問速度都比較慢,但是適用於有重複元素的應用。map是基於hash表的原理,在關鍵字和儲存物件

間建立直接索引,根據key可以直接定位元素,因此訪問速度非常快,但鍵值不允許重複。

從實現機制上看,mfc中的集合類總體分為兩大類,基於模板的(template-based classes)和不基於模板的。其中非模板類是在mfc v1.0中引入的,現在保留是為了相容問題。

首先要講清楚兩個定義或說明方式,下面帶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.

注意,

上面只是定義兩種新的資料型別,要在實際程式中使用,必須再定義該模板型別的變數,如:

myarray myarrary1;

對於ctypedptrmap的使用,其又可以分為以下幾類:

所有的都包含三個引數: 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...