MFC中陣列類的使用分析

2021-04-08 18:34:29 字數 4706 閱讀 4401

出處:vckbase

[ 2006-07-22 05:00 ]

mfc的陣列類支援的陣列類似於c++中的常規陣列,可以存放任何資料型別。

mfc的陣列類支援的陣列類似於c++中的常規陣列,可以存放任何資料型別。c++的常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,而mfc陣列類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的位址仍然是連續分配的。

mfc定義了陣列模板類carray,並針對各種常用變數型別定義了cbytearray,cwordarray,cuintarray,cdwordarray,cstringarray,cobarray,cptrarray。詳見下表:

陣列類

變數型別

變數數值範圍

標頭檔案

carray

通過模板類的引數型別設定各種型別

afxtempl.h

cbytearray

8位無符號整數 byte型別

0—255

afxcoll.h

cwordarray

16位無符號整數 word型別

0—65535

afxcoll.h

cdwordarray

32位無符號整數 dword型別

0—4294967295

afxcoll.h

cuintarray

32位無符號整數 uint型別

0—4294967295

afxcoll.h

cstringarray

cstring字串 string字串

afxcoll.h

cobarray

cobject類及其派生類

afxcoll.h

cptrarray void*

型別指標

afxcoll.h

mfc陣列類使用方法基本相同,下面分別以carray和cuintarray為例演示說明陣列類的使用方法。

使用 carray

開啟vc++ 6.0,建立基於對話方塊的工程array。carraydlg類宣告檔案(arraydlg.h)中新增語句:

#include

請記住:使用carray一定要包含標頭檔案afxtempl.h。

開啟主對話方塊資源idd_array_dialog,新增乙個按鈕idc_array_cpoint,標題為carray_cpoint,雙擊該按鈕,在onarraycpoint()函式中新增如下**:

void carraydlg::onarraycpoint()

{carray m_array;

m_array.setsize(10,10);

cpoint pt1(10,10);

m_array.add(pt1);

cpoint pt2(10,50);

m_array.add(pt2);

cpoint pt3(10,100);

m_array.add(pt3);

int size=m_array.getsize();

cclientdc dc(this);

dc.moveto(0,0);

cpoint pt;

for(int i=0;i

**簡要說明: carray m_array;

該語句定義乙個carray陣列物件,模板類carray有兩個引數,第乙個引數為陣列元素的型別,該例中是cpoint,即m_array是cpoint陣列;第二個引數為引用型別,一般有兩種選擇,一種選擇與第乙個引數型別相同,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件。第二種選擇是第乙個引數型別的引用,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件的指標。因此,尤其對於較複雜的陣列結構型別,推薦使用引用傳遞,節約記憶體同時加快程式執行速度,正如本例使用的是cpoint&。 m_array.setsize(10,10);

setsize函式設定陣列的大小,該函式有兩個引數,第乙個引數設定陣列的大小;第二個引數設定陣列增長時記憶體分配的大小,預設值是-1,使用預設值可以保證記憶體分配得更加合理。本例中第二個引數是10,意即增加乙個陣列元素會分配10個元素大小的記憶體供陣列使用。

您可以隨時使用setsize函式設定陣列的大小,如果第乙個引數值小於陣列已有成員數量,多於第乙個引數值的成員將被截去並釋放相應記憶體。

在使用carray陣列前,最好先使用setsize確定其大小並申請儲存空間。如果不這樣做,向陣列中增加元素時,需要不斷地移動和拷貝元素造成執行的低效率和記憶體碎塊。 m_array.add(pt1);

add函式新增陣列元素。

int size=m_array.getsize();

getsize返回陣列元素的數目。

for(int i=0;i

為了直觀顯示,該段**將各陣列元素作成折線畫到螢幕上,其中getat(int index)通過index值得到相應的元素值。編譯並執行程式,觀察執行結果。

繼續演示如何使用carray

再次開啟主對話方塊資源idd_array_dialog,新增乙個按鈕idc_array_cstring,標題為carray_cstring,雙擊該按鈕,在onarraycstring ()函式中新增如下**:

void carraydlg::onarraycstring()

{carray m_string;

cstring sztiger("tiger");

cstring szbear("bear");

cstring szdog("dog");

m_string.setatgrow(0,sztiger);

m_string.setatgrow(2,szdog);

m_string.insertat(1,szbear);

int count=m_string.getsize();

cclientdc dc(this);

dc.setbkmode(transparent);

textmetric textmetric;

dc.gettextmetrics(&textmetric);

int fontheight=textmetric.tmheight;

int displaypos=10;

for(int x=0;x

**簡要說明:

m_string.setatgrow(2,szdog);

setatgrow有兩個引數,第乙個引數決定陣列元素的序號值,第二個引數是元素的值。該函式根據序號值設定相應陣列元素的值,功能與setat相近,不同之處是使用該函式設定元素值時,如果序號值大於陣列的上界,陣列會自動增長。

編譯執行程式,細心的讀者您可能會看到,第一行字元是「tiger」,第二行字元是「bear」,這是我們預料之中的,但第三行是空串,第四行是「dog」。空串是怎樣造成的呢?細分析下面三行**就可以知道:

m_string.setatgrow(0,sztiger);

m_string.setatgrow(2,szdog);

m_string.insertat(1,szbear);

第一行設定元素0為「tiger」,這是沒有疑義的。

第二行設定元素2為「dog」,但是在設定元素2的同時自動將元素1填充為空串。

第三行插入「bear」為元素1,同時原來的元素1和元素2後移為元素2和元素3。

怎麼樣,這回明白了吧。m_string.insertat(1,szbear);

insertat函式在指定序號處插入相應元素,該函式在執行過程中,插入點後面的元素會自動後移。 dc.textout(10,displaypos,m_string[x]); 其中,m_string[x]是陣列類對操作符的過載,陣列類carray允許使用操作符,類似於c++的常規陣列。m_string[x]也可以用m_string.getat(x)替代。 m_string.removeat(2);

removeat只有乙個引數,即元素序號值。該函式根據元素序號值刪除相應元素值,後面的元素會自動前移。 m_string.removeall();

removeall刪除所有元素值

演示使用cuintarray類

開啟主對話方塊資源idd_array_dialog,新增乙個按鈕idc_cuintarray,標題為cuintarray,雙擊該按鈕,在oncuintarray ()函式中新增如下**:

void carraydlg::oncuintarray()

{cuintarray m_array;

m_array.setsize(5,5);

m_array.setat(0,0);

m_array.setat(1,1);

m_array.setat(2,2);

m_array.setat(3,3);

m_array.setat(4,4);

int count=m_array.getsize();

cclientdc dc(this);

dc.setbkmode(transparent);

textmetric textmetric;

dc.gettextmetrics(&textmetric);

int fontheight=textmetric.tmheight;

int displaypos=10;

for(int x=0;x

這部分**不作說明,請讀者自行分析。

最後再說明一點:removeat,insertat函式操作時會使得陣列元素移位,執行時間大於setat,removeall,add函式。 

使用MFC的陣列類

mfc的陣列類支援的陣列類似於c 中的常規陣列,可以存放任何資料型別。c 的常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,而mfc陣列類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的位址仍然 是連續分配的。mf...

使用MFC的陣列類

mfc的陣列類支援的陣列類似於c 中的常規陣列,可以存放任何資料型別。c 的常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,而mfc陣列類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的位址仍然是連續分配的。mfc...

VC 使用MFC的陣列類

使用mfc的陣列類 mfc 的陣列類支援的陣列類似於c 中的常規陣列,可以存放任何資料型別。c 的常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,而mfc陣列 類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的位址...