CMap
是 MFC 中用于存儲鍵值對(key-value)的關聯容器類,類似于 C++ 標準庫中的 std::map
,但依賴 MFC 框架實現。它采用哈希表(Hash Table)作為底層數據結構,支持高效的鍵值查找、插入和刪除操作。以下是 CMap
的常用函數及用法示例:
一、基本定義與初始化
CMap
是模板類,聲明時需指定“鍵類型”和“值類型”:
// 聲明:CMap<鍵類型, 鍵參數類型, 值類型, 值參數類型>
// 注:參數類型通常與鍵/值類型一致(除了對象類型需用引用)
CMap<CString, LPCTSTR, int, int> mapStrToInt; // 鍵:CString,值:int
CMap<int, int, CString, LPCTSTR> mapIntToStr; // 鍵:int,值:CString
二、插入元素(添加鍵值對)
使用 SetAt
方法插入或更新鍵值對:
// 插入:若鍵不存在則新增,若已存在則更新值
mapStrToInt.SetAt(_T("Apple"), 10); // "Apple" → 10
mapStrToInt.SetAt(_T("Banana"), 20); // "Banana" → 20// 插入 int→CString 類型
mapIntToStr.SetAt(1, _T("Monday")); // 1 → "Monday"
mapIntToStr.SetAt(2, _T("Tuesday")); // 2 → "Tuesday"
三、查找元素(根據鍵獲取值)
通過 Lookup
方法查找鍵對應的值,返回 BOOL
表示是否找到:
// 查找 CString→int 映射
int nValue;
if (mapStrToInt.Lookup(_T("Apple"), nValue)) // 查找鍵 "Apple"
{TRACE(_T("找到值:%d\n"), nValue); // 輸出:10
}// 查找 int→CString 映射
CString strValue;
if (mapIntToStr.Lookup(1, strValue)) // 查找鍵 1
{TRACE(_T("找到值:%s\n"), strValue); // 輸出:Monday
}
四、刪除元素
RemoveKey
:刪除指定鍵的鍵值對RemoveAll
:清空整個映射表
// 刪除單個鍵值對
mapStrToInt.RemoveKey(_T("Banana")); // 刪除 "Banana" 對應的鍵值對// 清空所有元素
mapIntToStr.RemoveAll(); // 清空 mapIntToStr
五、遍歷所有鍵值對
CMap
通過 POSITION
迭代器遍歷,需結合 GetStartPosition
和 GetNextAssoc
方法:
// 遍歷 CString→int 映射
POSITION pos = mapStrToInt.GetStartPosition(); // 獲取起始位置
while (pos != NULL)
{CString strKey;int nValue;// 獲取當前鍵值對,并移動到下一個位置mapStrToInt.GetNextAssoc(pos, strKey, nValue);TRACE(_T("鍵:%s,值:%d\n"), strKey, nValue);
}// 遍歷結果(假設未刪除元素):
// 鍵:Apple,值:10
// 鍵:Banana,值:20
六、其他常用函數
函數 | 功能說明 | 示例 |
---|---|---|
GetCount | 返回鍵值對的數量 | int nCount = mapStrToInt.GetCount(); |
IsEmpty | 判斷映射表是否為空 | if (mapStrToInt.IsEmpty()) { ... } |
operator [] | 簡化插入/訪問(類似數組),僅部分版本支持 | mapStrToInt[_T("Orange")] = 30; |
Lookup 失敗處理 | 未找到時返回默認值(需手動判斷) | 見“查找元素”示例 |
七、注意事項
- 鍵的唯一性:
CMap
中鍵必須唯一,重復插入相同鍵會覆蓋原有值(SetAt
方法的特性)。 - 哈希表特性:遍歷順序與插入順序無關(哈希表不保證順序),若需有序遍歷,建議使用
CMapStringToOb
或標準庫std::map
。 - 類型匹配:模板參數需嚴格匹配(尤其是字符串類型,
CString
對應LPCTSTR
作為參數類型)。 - 內存管理:
CMap
會自動管理內部存儲的鍵值對內存,銷毀對象時無需手動釋放。 - 性能:哈希表的查找、插入、刪除效率均為
O(1)
(平均情況),適合存儲大量鍵值對。
總結
CMap
是 MFC 中高效的鍵值對管理工具,核心功能圍繞“插入(SetAt
)、查找(Lookup
)、刪除(RemoveKey
)、遍歷(GetNextAssoc
)”展開。它適合需要快速根據鍵獲取值的場景(如配置表、緩存數據),但需注意其無序性和鍵的唯一性約束。