jasmine214--love

          只有當(dāng)你的內(nèi)心總是充滿快樂(lè)、美好的愿望和寧?kù)o時(shí),你才能擁有強(qiáng)壯的體魄和明朗、快樂(lè)或者寧?kù)o的面容。
          posts - 731, comments - 60, trackbacks - 0, articles - 0
           

          原文: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ì)各種常用變量類型定義了CByteArrayCArrayCUIntArrayCDArrayCStringArrayCObArrayCPtrArray。詳見(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ù)組類使用方法基本相同,下面分別以CArrayCUIntArray為例演示說(shuō)明數(shù)組類的使用方法。

          使用 CArray www.打開(kāi)++ 6.0,創(chuàng)建基于對(duì)話框的工程ArrayCArrayDlg類聲明文件(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_ArrayCPoint數(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):RemoveAtInsertAt函數(shù)操作時(shí)會(huì)使得數(shù)組元素移位,運(yùn)行時(shí)間大于SetAtRemoveAllAdd函數(shù)。

          主站蜘蛛池模板: 建湖县| 印江| 台安县| 南涧| 连云港市| 贡山| 峨眉山市| 梁山县| 泊头市| 濮阳县| 郴州市| 通州区| 新绛县| 梁山县| 汝阳县| 双流县| 株洲市| 临高县| 沂南县| 肥西县| 务川| 台北市| 那曲县| 盐亭县| 辉南县| 海淀区| 双峰县| 灵寿县| 南投市| 长汀县| 台北县| 兴化市| 甘泉县| 临沭县| 会泽县| 高阳县| 德清县| 新泰市| 乐陵市| 德州市| 曲松县|