CArray


使用CArray一定要包含頭文件afxtempl.h

打開主對話框資源IDD_ARRAY_DIALOG,添加一個按鈕IDC_ARRAY_CPOINT,標題為CArray_CPoint,雙擊該按鈕,在OnArrayCpoint()函數中添加如下代碼:

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);
    }
}

代碼簡要說明:

CArray <CPoint,CPoint&> m_Array;

  該語句定義一個CArray數組對象,模板類CArray有兩個參數,第一個參數為數組元素的類型,該例中是CPoint,即m_Array是CPoint數組;第二個參數為引用類型,一般有兩種選擇,一種選擇與第一個參數類型相同,它意味着數組對象作為參數傳遞時,傳遞的是數組對象。第二種選擇是第一個參數類型的引用,它意味着數組對象作為參數傳遞時,傳遞的是數組對象的指針。因此,尤其對於較復雜的數組結構類型,推薦使用引用傳遞,節約內存同時加快程序運行速度,正如本例使用的是CPoint&。

m_Array.SetSize(10,10); 

  SetSize函數設定數組的大小,該函數有兩個參數,第一個參數設定數組的大小;第二個參數設定數組增長時內存分配的大小,缺省值是-1,使用缺省值可以保證內存分配得更加合理。本例中第二個參數是10,意即增加一個數組元素會分配10個元素大小的內存供數組使用。
  您可以隨時使用SetSize函數設定數組的大小,如果第一個參數值小於數組已有成員數量,多於第一個參數值的成員將被截去並釋放相應內存。
  在使用CArray數組前,最好先使用SetSize確定其大小並申請存儲空間。如果不這樣做,向數組中增加元素時,需要不斷地移動和拷貝元素造成運行的低效率和內存碎塊。

m_Array.Add(pt1); 

  Add函數添加數組元素。

int size=m_Array.GetSize();

  GetSize返回數組元素的數目。

for(int i=0;i<size;i++){ pt=m_Array.GetAt(i); dc.LineTo(pt);}

  為了直觀顯示,該段代碼將各數組元素作成折線畫到屏幕上,其中GetAt(int index)通過index值得到相應的元素值。編譯並運行程序,觀察運行結果。

繼續演示如何使用CArray

  再次打開主對話框資源IDD_ARRAY_DIALOG,添加一個按鈕IDC_ARRAY_CSTRING,標題為CArray_CString,雙擊該按鈕,在OnArrayCstring ()函數中添加如下代碼:

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."); }

代碼簡要說明:

m_string.SetAtGrow(2,szdog); edu-cn.com

  SetAtGrow有兩個參數,第一個參數決定數組元素的序號值,第二個參數是元素的值。該函數根據序號值設置相應數組元素的值,功能與SetAt相近,不同之處是使用該函數設置元素值時,如果序號值大於數組的上界,數組會自動增長。
  編譯運行程序,細心的讀者您可能會看到,第一行字符是“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。

怎么樣,這回明白了吧。

m_string.InsertAt(1,szbear);

  InsertAt函數在指定序號處插入相應元素,該函數在執行過程中,插入點后面的元素會自動后移。dc.TextOut(10,displayPos,m_string[x]);其中,m_string[x]是數組類對操作符[]的重載,數組類CArray允許使用[]操作符,類似於的常規數組。m_string[x]也可以用m_string.GetAt(x)替代。

m_string.RemoveAt(2); 

  RemoveAt只有一個參數,即元素序號值。該函數根據元素序號值刪除相應元素值,后面的元素會自動前移。

m_string.RemoveAll();

  RemoveAll刪除所有元素值

  最后再說明一點:RemoveAt,InsertAt函數操作時會使得數組元素移位,運行時間大於SetAt,RemoveAll,Add函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM