引用 MFC類庫複習5 1 CArray

2021-06-07 07:25:37 字數 3516 閱讀 2773

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