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
)”展开。它适合需要快速根据键获取值的场景(如配置表、缓存数据),但需注意其无序性和键的唯一性约束。