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操作符與多維陣...