首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 陣列類別完整使用指南:CArray、CUIntArray 等

     編輯:關於VC++

MFC 陣列類別概覽

MFC 陣列類別類似 C++ 內建陣列,可儲存任意資料類型,但具備動態調整大小能力:下標從 0 開始,上限可固定或隨元素增加自動增長,記憶體連續配置。

MFC 定義模板類別 CArray,並針對常用類型提供具體類別:

陣列類別元素類型數值範圍標頭檔
CArray模板參數決定-Afxtempl.h
CByteArrayBYTE (8 位元無號)0~255Afxcoll.h
CWordArrayWORD (16 位元無號)0~65535Afxcoll.h
CDWordArrayDWORD (32 位元無號)0~4294967295Afxcoll.h
CUIntArrayUINT (32 位元無號)0~4294967295Afxcoll.h
CStringArrayCString-Afxcoll.h
CObArrayCObject*-Afxcoll.h
CPtrArrayvoid*-Afxcoll.h

CArray 使用範例

範例 1:儲存 CPoint 繪製折線

#include <afxtempl.h>  // 必須包含

void CArrayDlg::OnArrayCpoint()
{
    CArray<CPoint, CPoint&> m_Array;  // 參數 2 用參考型別避免複製大型物件
    m_Array.SetSize(10, 10);           // 初始 10,成長 10
    
    m_Array.Add(CPoint(10, 10));
    m_Array.Add(CPoint(10, 50));
    m_Array.Add(CPoint(10, 100));
    
    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);
    }
}

關鍵點:

  • SetSize(n, grow):預先配置記憶體,避免頻繁擴充造成碎片與低效
  • 模板第 2 參數用 CPoint& 參考傳遞,節省記憶體與提升速度
  • GetAt(i) 或 operator[] 存取元素

範例 2:CString 陣列操作示範

void CArrayDlg::OnArrayCstring()
{
    CArray<CString, CString&> m_string;
    CString sztiger("tiger"), szbear("bear"), szdog("dog");
    
    m_string.SetAtGrow(0, sztiger);  // 索引 0
    m_string.SetAtGrow(2, szdog);    // 索引 2,自動擴充並填補索引 1 為空字串
    m_string.InsertAt(1, szbear);    // 索引 1 插入,原 1、2 後移
    
    // 顯示:tiger, bear, (空), dog
    // ... 繪製程式碼略 ...
    
    AfxMessageBox("Continue...");
    m_string.RemoveAt(2);            // 刪除索引 2,後續前移
    // ... 顯示剩餘 ...
    
    AfxMessageBox("A string has delete, continue...");
    m_string.RemoveAll();            // 清空
}

關鍵函數:

  • SetAtGrow(i, val):指定索引設值,超出範圍自動擴充
  • InsertAt(i, val):插入,後續元素自動後移
  • RemoveAt(i):刪除指定索引,後續前移
  • RemoveAll():清空所有元素

CUIntArray 使用範例

void CArrayDlg::OnCuintarray()
{
    CUIntArray m_array;
    m_array.SetSize(5, 5);
    for (int i = 0; i < 5; i++) m_array.SetAt(i, i);
    
    int count = m_array.GetSize();
    CClientDC dc(this);
    dc.SetBkMode(TRANSPARENT);
    // ... 取得字型高度 ...
    for (int x = 0; x < count; x++)
    {
        CString str;
        str.Format("%d", m_array.GetAt(x));
        dc.TextOut(10, displayPos, str);
        displayPos += fontHeight;
    }
}

效能提示

RemoveAt、InsertAt 會導致元素移位,耗時較 SetAt、Add、RemoveAll 久。大量插刪建議改用 CList。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved