MFC陣列類CArray的使用

2021-07-25 09:48:06 字數 4559 閱讀 1094

mfc陣列類carray的使用的操作詳解***

mfc的陣列類支援的陣列類似於常規陣列,可以存放任何資料型別。常規陣列在使用前必須將其定義成能夠容納所有可能需要的元素,即先確定大小,而

mfc陣列類建立的物件可以根據需要動態地增大或減小,陣列的起始下標是

0,而上限可以是固定的,也可以隨著元素的增加而增加,陣列在記憶體中的位址仍然是連續分配的。

mfc定義了陣列模板類

carray

,並針對各種常用變數型別定義了

cbytearray

,carray

,cuintarray

,cdarray

,cstringarray

,cobarray

,cptrarray

。詳見下表:

edu-cn.com

陣列類變數型別

變數數值範圍

標頭檔案carray

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

afxtempl.h

cbytearray 8

位無符號整數

byte型別

0—255

afxcoll.h

carray 16

位無符號整數

word型別

0—65535

afxcoll.h

cdarray 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 www.

開啟++ 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;

中國教程網

該語句定義乙個

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()

afxmessagebox("continue...");

m_string.removeat(2);

count=m_string.getsize(); 

for(x=0;x

afxmessagebox("a string has delete,continue...");   

m_string.removeall();    

count=m_string.getsize();          

if(count==0)                       

afxmessagebox("all elements are deleted.");}

**簡要說明:

m_string.setatgrow(2,szdog);

edu-cn.com

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

允許使用

操作符,類似於的常規陣列。

m_string[x]

也可以用

m_string.getat(x)

替代。

m_string.removeat(2);

edu-cn.com

removeat

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

m_string.removeall();

removeall

刪除所有元素值

最後再說明一點:

removeat

,insertat

函式操作時會使得陣列元素移位,執行時間大於

setat

,removeall

,add

函式。

MFC陣列類CArray的使用的操作詳解

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

C Array類 建立陣列

除了使用c 語法 建立陣列之外,還可以使用靜態方法 createinstance 建立陣列。舉個例子 array intarray1 array.createinstance typeof int 5 for int i 0 i 5 i for int i 0 i 5 i 在這個例子中,演示了如何建...

C Array類 建立陣列

c 中建立陣列,常見的例如 int array new int 5 除了使用c 語法 建立陣列之外,還可以使用靜態方法createinstance 建立陣列。array test array.createinstance typeof int 5 for int i 0 i test length ...