MFC 陣列類別類似 C++ 內建陣列,可儲存任意資料類型,但具備動態調整大小能力:下標從 0 開始,上限可固定或隨元素增加自動增長,記憶體連續配置。
MFC 定義模板類別 CArray,並針對常用類型提供具體類別:
| 陣列類別 | 元素類型 | 數值範圍 | 標頭檔 |
|---|---|---|---|
CArray | 模板參數決定 | - | Afxtempl.h |
CByteArray | BYTE (8 位元無號) | 0~255 | Afxcoll.h |
CWordArray | WORD (16 位元無號) | 0~65535 | Afxcoll.h |
CDWordArray | DWORD (32 位元無號) | 0~4294967295 | Afxcoll.h |
CUIntArray | UINT (32 位元無號) | 0~4294967295 | Afxcoll.h |
CStringArray | CString | - | Afxcoll.h |
CObArray | CObject* | - | Afxcoll.h |
CPtrArray | void* | - | Afxcoll.h |
#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):預先配置記憶體,避免頻繁擴充造成碎片與低效CPoint& 參考傳遞,節省記憶體與提升速度GetAt(i) 或 operator[] 存取元素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():清空所有元素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。