MFC數(shù)組類CArray的使用的操作詳解
Posted on 2010-08-12 11:23 幻海藍(lán)夢(mèng) 閱讀(632) 評(píng)論(0) 編輯 收藏 所屬分類: C++原文:http://www.cnblogs.com/kingln/archive/2008/08/21/1272962.html
MFC的數(shù)組類支持的數(shù)組類似于常規(guī)數(shù)組,可以存放任何數(shù)據(jù)類型。常規(guī)數(shù)組在使用前必須將其定義成能夠容納所有可能需要的元素,即先確定大小,而MFC數(shù)組類創(chuàng)建的對(duì)象可以根據(jù)需要?jiǎng)討B(tài)地增大或減小,數(shù)組的起始下標(biāo)是0,而上限可以是固定的,也可以隨著元素的增加而增加,數(shù)組在內(nèi)存中的地址仍然是連續(xù)分配的。
MFC定義了數(shù)組模板類CArray,并針對(duì)各種常用變量類型定義了CByteArray,CArray,CUIntArray,CDArray,CStringArray,CObArray,CPtrArray。詳見(jiàn)下表:edu-cn.com
數(shù)組類 |
變量類型 |
變量數(shù)值范圍 |
頭文件 |
CArray |
通過(guò)模板類的參數(shù)類型設(shè)定各種類型 |
|
Afxtempl.h |
CByteArray |
8位無(wú)符號(hào)整數(shù) BYTE類型 |
0—255 |
Afxcoll.h |
CArray |
16位無(wú)符號(hào)整數(shù) WORD類型 |
0—65535 |
Afxcoll.h |
CDArray |
32位無(wú)符號(hào)整數(shù) DWORD類型 |
0—4294967295 |
Afxcoll.h |
CUIntArray |
32位無(wú)符號(hào)整數(shù) UINT類型 |
0—4294967295 |
Afxcoll.h |
CStringArray |
CString字符串 string字符串 |
|
Afxcoll.h |
CObArray |
CObject類及其派生類 |
|
Afxcoll.h |
CPtrArray |
void* 類型指針 |
|
Afxcoll.h |
中國(guó)教程網(wǎng)
MFC數(shù)組類使用方法基本相同,下面分別以CArray和CUIntArray為例演示說(shuō)明數(shù)組類的使用方法。
使用 CArray www.打開(kāi)++ 6.0,創(chuàng)建基于對(duì)話框的工程Array。CArrayDlg類聲明文件(ArrayDlg.h)中添加語(yǔ)句:
中國(guó)教程網(wǎng)
#include <afxtempl.h>
請(qǐng)記住:使用CArray一定要包含頭文件afxtempl.h。
打開(kāi)主對(duì)話框資源IDD_ARRAY_DIALOG,添加一個(gè)按鈕IDC_ARRAY_CPOINT,標(biāo)題為CArray_CPoint,雙擊該按鈕,在OnArrayCpoint()函數(shù)中添加如下代碼:
void CArrayDlg::OnArrayCpoint()
{ CArray <CPoint,CPoint&> 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();
CClientDC dc(this);
dc.MoveTo(0,0);
CPoint pt;
for(int i=0;i<size;i++)
{ pt=m_Array.GetAt(i);
dc.LineTo(pt); }}
代碼簡(jiǎn)要說(shuō)明:
CArray <CPoint,CPoint&> m_Array; 中國(guó)教程網(wǎng)
該語(yǔ)句定義一個(gè)CArray數(shù)組對(duì)象,模板類CArray有兩個(gè)參數(shù),第一個(gè)參數(shù)為數(shù)組元素的類型,該例中是CPoint,即m_Array是CPoint數(shù)組;第二個(gè)參數(shù)為引用類型,一般有兩種選擇,一種選擇與第一個(gè)參數(shù)類型相同,它意味著數(shù)組對(duì)象作為參數(shù)傳遞時(shí),傳遞的是數(shù)組對(duì)象。第二種選擇是第一個(gè)參數(shù)類型的引用,它意味著數(shù)組對(duì)象作為參數(shù)傳遞時(shí),傳遞的是數(shù)組對(duì)象的指針。因此,尤其對(duì)于較復(fù)雜的數(shù)組結(jié)構(gòu)類型,推薦使用引用傳遞,節(jié)約內(nèi)存同時(shí)加快程序運(yùn)行速度,正如本例使用的是CPoint&。
m_Array.SetSize(10,10); 中國(guó)教程網(wǎng)
SetSize函數(shù)設(shè)定數(shù)組的大小,該函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)設(shè)定數(shù)組的大小;第二個(gè)參數(shù)設(shè)定數(shù)組增長(zhǎng)時(shí)內(nèi)存分配的大小,缺省值是-1,使用缺省值可以保證內(nèi)存分配得更加合理。本例中第二個(gè)參數(shù)是10,意即增加一個(gè)數(shù)組元素會(huì)分配10個(gè)元素大小的內(nèi)存供數(shù)組使用。
您可以隨時(shí)使用SetSize函數(shù)設(shè)定數(shù)組的大小,如果第一個(gè)參數(shù)值小于數(shù)組已有成員數(shù)量,多于第一個(gè)參數(shù)值的成員將被截去并釋放相應(yīng)內(nèi)存。
在使用CArray數(shù)組前,最好先使用SetSize確定其大小并申請(qǐng)存儲(chǔ)空間。如果不這樣做,向數(shù)組中增加元素時(shí),需要不斷地移動(dòng)和拷貝元素造成運(yùn)行的低效率和內(nèi)存碎塊。
m_Array.Add(pt1); 中國(guó)教程網(wǎng)
Add函數(shù)添加數(shù)組元素。
int size=m_Array.GetSize();
GetSize返回?cái)?shù)組元素的數(shù)目。
for(int i=0;i<size;i++){ pt=m_Array.GetAt(i); dc.LineTo(pt);}
為了直觀顯示,該段代碼將各數(shù)組元素作成折線畫(huà)到屏幕上,其中GetAt(int index)通過(guò)index值得到相應(yīng)的元素值。編譯并運(yùn)行程序,觀察運(yùn)行結(jié)果。
繼續(xù)演示如何使用CArray
再次打開(kāi)主對(duì)話框資源IDD_ARRAY_DIALOG,添加一個(gè)按鈕IDC_ARRAY_CSTRING,標(biāo)題為CArray_CString,雙擊該按鈕,在OnArrayCstring ()函數(shù)中添加如下代碼:
void CArrayDlg::OnArrayCstring()
{ CArray<CSTRING,CSTRING&> m_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();
CClientDC dc(this);
dc.SetBkMode(TRANSPARENT);
TEXTMETRIC textMetric;
dc.GetTextMetrics(&textMetric);
int fontHeight=textMetric.tmHeight;
int displayPos=10;
for(int x=0;x<count;++x)
{
dc.TextOut(10,displayPos,m_string[x]); displayPos+=fontHeight;
}
AfxMessageBox("Continue...");
m_string.RemoveAt(2);
count=m_string.GetSize();
for(x=0;x<count;++x)
{
dc.TextOut(10,displayPos,m_string[x]);
displayPos+=fontHeight;
}
AfxMessageBox("A string has delete,continue...");
m_string.RemoveAll();
count=m_string.GetSize();
if(count==0)
AfxMessageBox("All elements are deleted.");}
代碼簡(jiǎn)要說(shuō)明:
m_string.SetAtGrow(2,szdog); edu-cn.com
SetAtGrow有兩個(gè)參數(shù),第一個(gè)參數(shù)決定數(shù)組元素的序號(hào)值,第二個(gè)參數(shù)是元素的值。該函數(shù)根據(jù)序號(hào)值設(shè)置相應(yīng)數(shù)組元素的值,功能與SetAt相近,不同之處是使用該函數(shù)設(shè)置元素值時(shí),如果序號(hào)值大于數(shù)組的上界,數(shù)組會(huì)自動(dòng)增長(zhǎng)。
編譯運(yùn)行程序,細(xì)心的讀者您可能會(huì)看到,第一行字符是“tiger”,第二行字符是“bear”,這是我們預(yù)料之中的,但第三行是空串,第四行是“dog”。空串是怎樣造成的呢?細(xì)分析下面三行代碼就可以知道:
m_string.SetAtGrow(0,sztiger);m_string.SetAtGrow(2,szdog);m_string.InsertAt(1,szbear);
第一行設(shè)定元素0為“tiger”,這是沒(méi)有疑義的。
第二行設(shè)定元素2為“dog”,但是在設(shè)定元素2的同時(shí)自動(dòng)將元素1填充為空串。
第三行插入“bear”為元素1,同時(shí)原來(lái)的元素1和元素2后移為元素2和元素3。
怎么樣,這回明白了吧。
m_string.InsertAt(1,szbear);
InsertAt函數(shù)在指定序號(hào)處插入相應(yīng)元素,該函數(shù)在執(zhí)行過(guò)程中,插入點(diǎn)后面的元素會(huì)自動(dòng)后移。dc.TextOut(10,displayPos,m_string[x]);其中,m_string[x]是數(shù)組類對(duì)操作符[]的重載,數(shù)組類CArray允許使用[]操作符,類似于的常規(guī)數(shù)組。m_string[x]也可以用m_string.GetAt(x)替代。
m_string.RemoveAt(2); edu-cn.com
RemoveAt只有一個(gè)參數(shù),即元素序號(hào)值。該函數(shù)根據(jù)元素序號(hào)值刪除相應(yīng)元素值,后面的元素會(huì)自動(dòng)前移。
m_string.RemoveAll();
RemoveAll刪除所有元素值
最后再說(shuō)明一點(diǎn):RemoveAt,InsertAt函數(shù)操作時(shí)會(huì)使得數(shù)組元素移位,運(yùn)行時(shí)間大于SetAt,RemoveAll,Add函數(shù)。