五 C 中CArray動態陣列的使用

2021-05-01 04:13:09 字數 1738 閱讀 9007

carray

是乙個可以存放任何資料型別的複雜的陣列結構,並可以實現陣列的動態管理,在記憶體中的位址分配是連續的,可以提高程式的效率。在

mfc中還提供了常用的變數型別,分別定義為

cbytearray

、cwordarray

、cuintarray

、cdwrodarray

、cstringarray

、cobarray

、cptrarray。

(1) 利用陣列類模板,定義

cpoint

型別的陣列類,例如:

carray m_array;

該語句定義乙個

carray

陣列物件,模板類

carray

有兩個引數,第乙個是陣列元素的型別,第二是引數的引用型別,一般有兩種選擇,一種與第一人引數型別相同,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件。第二種選擇是第乙個引數型別的引用,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件的指標。

(2)設定陣列的大小。

一般而言,使用陣列類時,最好使用

setsize

函式設定陣列的大小並申請記憶體空間。例如:

m_array.setsize(0, 1);

設定陣列的大小,第乙個引數設定陣列的大小,第二引數設定陣列增長時記憶體分配的大小,預設值是

-1,使用預設值可以保證記憶體分配更加合理。本例中是

1,意思是增加乙個陣列元素會分配

1個元素大小的記憶體供陣列使用。如果第乙個引數值小於陣列已有成員數量,大於第乙個引數值的成員將被截去並釋放相應記憶體。

(3)獲取陣列的大小。

可以使用

carray

類的getsize

函式獲取陣列的大小,例如:

int nsize = m_array.getupperbound();

由於陣列值從

0開始,所以它的值比

getsize()

函式得到的值小

1。如果

getupperbound()

返回值為

-1,則表明該陣列中不存在元素。

(4)常用carray

陣列類成員函式。

add

在陣列的最後增加乙個陣列元素。

getsize

取得陣列中包含的元素個數。

removeall

刪除數線中的所有元素。

getat

獲取陣列內指定位置處的值。

int carray::add(arg_type newelement

add函式使用的引數是模板引數的二個引數,也就是說,這個引數的型別是我們來決定的,可以使用object或object&的方式。熟悉c++

的朋友都知道,傳引用的效率要高一些。如果是傳值的話,會在堆疊中再產生乙個新的物件,需要花費更多的時間。

下面來分析一下add函式的**:

template

afx_inline int carray::add(arg_type newelement)

它實際是通過setatgrow函式來完成這個功能的,它的作用是設定指定元素的值。下面是setatgrow的**:

template

void carray::setatgrow(int nindex, arg_type newelement)

setatgrow的實現也很簡單,如果指定的元素已經存在,就把改變指定元素的值。如果指定的元素不存在,也就是 nindex>=

C 中動態陣列 陣列引數

一 c 中的動態陣列 寫程式的時候,我在想動態陣列怎麼寫,new int,方括號中可以寫常量嗎,真是鬱悶,一些基本的知識都不記得,還是多練練吧。int pia new int 10 陣列的維數可以是任意的複雜表示式。delete pia 動態分配陣列時,陣列元素為類型別呼叫預設建構函式,內建型別的不...

C 中的動態多維陣列

前言 c 的new操作符是該語言乙個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維陣列空間時,不能讓陣列的每一維都動態可變。本文將對此提出乙個簡單直觀的解決方案,在乙個實際問題的簡化模型中加以說明,並以此釋清許多初學者對c 中new操作符與多維陣...

C 中的動態多維陣列

前言 c 的new操作符是該語言乙個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維陣列空間時,不能讓陣列的每一維都動態可變。本文將對此提出乙個簡單直觀的解決方案,在乙個實際問題的簡化模型中加以說明,並以此釋清許多初學者對c 中new操作符與多維陣...