2009-09-22 10:37:46
| 分類:
預設分類
| 標籤:|字型大小
大中小訂閱
引用
sun201201 的mfc類庫複習5(1)--carray
c++並不支援動態陣列,mfc提供了乙個carray類來實現動態陣列的功能。有效的使用carray類,可以提高程式的效率。mfc提供了一套模板庫,來實現一些比較常見的資料結構如array,list,map。carray即為其中的乙個,用來實現動態陣列的功能。
一、carray類的建構函式
carray是從cobject派生,有兩個模板引數,第乙個引數就是carray類陣列元素的變數型別,後乙個是函式呼叫時的引數型別。有乙個類 class object,要定義乙個object的動態陣列,那麼可以用以下兩種方法:
carrayvar1;
carrayvar2;
var2的效率要高。舉例說明如下:
carray m_array;
該語句定義乙個carray陣列物件,模板類carray有兩個引數,第乙個引數為陣列元素的型別,該例中是cpoint,即m_array是 cpoint陣列;第二個引數為引用型別,一般有兩種選擇,一種選擇與第乙個引數型別相同,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件。第二種選擇是第乙個引數型別的引用,它意味著陣列物件作為引數傳遞時,傳遞的是陣列物件的指標。因此,尤其對於較複雜的陣列結構型別,推薦使用引用傳遞,節約記憶體同時加快程式執行速度,正如本例使用的是cpoint&。
二、carray類成員函式
1. 屬性
getsize()獲得此陣列中的元素數
getupperbound()返回最大的有效索引值
setsize()設定包含在此陣列中的元素數
2. 操作
freeextra()釋放大於當前上界的未使用的記憶體
removeall()從此陣列移去所有元素
3. 元素訪問
getat()返回在給定索引上的值
setat()設定乙個給定索引的值;陣列不允許擴充套件
elementat()返回乙個對陣列中元素指標的臨時參考
getdata()允許對陣列中的元素訪問。可以為null
5. 插入/移去
insertat()在指定的索引上插入乙個元素(或另乙個陣列中的所有元素)
removeat()在指定的索引上移去乙個元素
6. 運算子
[ ]在特定索引上設定或獲取元素
三、carray類使用舉例
1. 一條良好的使用原則:
在使用乙個陣列之前,使用setsize建立它的大小和為它分配記憶體。如果不使用setsize,則為陣列新增元素就會引起頻繁地重新分配和拷貝。頻繁地重新分配和拷貝不但沒有效率,而且導致記憶體碎片。
2. add()和setsize()的使用舉例
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();
setsize()函式設定陣列的大小,該函式有兩個引數,
(1)第乙個引數設定陣列的大小;
(2)第二個引數設定陣列增長時記憶體分配的大小,預設值是-1,使用預設值可以保證記憶體分配得更合理。
本例中第二個引數是10,意即增加乙個陣列元素會分配10個元素大小的記憶體供陣列使用。
您可以隨時使用setsize函式設定陣列的大小,如果第乙個引數值小於陣列已有成員數量,多於第乙個引數值的成員將被截去並釋放相應記憶體。
再次強調:在使用carray陣列前,最好先使用setsize確定其大小並申請儲存空間。如果不這樣做,向陣列中增加元素時,需要不斷地移動和拷貝元素造成執行的低效率和記憶體碎塊。
3. setatgrow()和setat()函式
setatgrow有兩個引數,第乙個引數決定陣列元素的序號值,第二個引數是元素的值。該函式根據序號值設定相應陣列元素的值,功能與setat相近,不同之處是使用該函式設定元素值時,如果序號值大於陣列的上界,陣列會自動增長。舉例如下:carraym_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();
編譯執行程式,細心的讀者您可能會看到,輸出結果如下:
第一行字元是「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。
怎麼樣,這回明白了吧。
4. removeat()和insertat()函式
insertat函式在指定序號處插入相應元素,該函式在執行過程中,插入點後面的元素會自動後移。
removeat只有乙個引數,即元素序號值。該函式根據元素序號值刪除相應元素值,後面的元素會自動前移。
最後再說明一點:removeat,insertat函式操作時會使得陣列元素移位,執行時間大於setat,removeall,add函式。
MFC類庫簡介(一)
說明 本文是我學習mfc時寫的筆記,引用了 visual c 6.0程式設計實用技術與案例 清華大學出版社 陳元琰 鄧宗明 張睿哲 張曉競 編著 因此本文僅用於相互交流,切勿用於商業用途,本人不承擔任何責任!1 概要 微軟基礎類庫 microsoft class library,mfc 由兩大部分組...
WPF新增類庫並引用
首先利用wpf嚮導建立乙個空的專案 using system.windows xmlns xmlns x xmlns d xmlns mc mc ignorable d title mainwindow height 450 width 800 右擊解決方案 新增 新建項 找到類庫 net fram...
資料庫複習5 安全性
如果說完整性是針對授權使用者的資料庫保護措施,那麼安全性就是針對非授權使用者的資料庫保護措施 安全性問題涉及的層面很多,非法使用者可以從以下各層面對資料庫的竊取或篡改 層面竊取或篡改行為 應對措施 資料庫系統 獲取高階使用者資料庫許可權 身份驗證,許可權和可獲取資料對等 作業系統 獲取作業系統roo...