CMap常用函数

CMap 是 MFC 中用于存储键值对(key-value)的关联容器类,类似于 C++ 标准库中的 std::map,但依赖 MFC 框架实现。它采用哈希表(Hash Table)作为底层数据结构,支持高效的键值查找、插入和删除操作。以下是 CMap 的常用函数及用法示例:

一、基本定义与初始化

CMap 是模板类,声明时需指定"键类型"和"值类型":

cpp 复制代码
// 声明:CMap<键类型, 键参数类型, 值类型, 值参数类型>
// 注:参数类型通常与键/值类型一致(除了对象类型需用引用)
CMap<CString, LPCTSTR, int, int> mapStrToInt;  // 键:CString,值:int
CMap<int, int, CString, LPCTSTR> mapIntToStr;  // 键:int,值:CString

二、插入元素(添加键值对)

使用 SetAt 方法插入或更新键值对:

cpp 复制代码
// 插入:若键不存在则新增,若已存在则更新值
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 表示是否找到:

cpp 复制代码
// 查找 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:清空整个映射表
cpp 复制代码
// 删除单个键值对
mapStrToInt.RemoveKey(_T("Banana"));  // 删除 "Banana" 对应的键值对

// 清空所有元素
mapIntToStr.RemoveAll();  // 清空 mapIntToStr

五、遍历所有键值对

CMap 通过 POSITION 迭代器遍历,需结合 GetStartPositionGetNextAssoc 方法:

cpp 复制代码
// 遍历 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 失败处理 未找到时返回默认值(需手动判断) 见"查找元素"示例

七、注意事项

  1. 键的唯一性CMap 中键必须唯一,重复插入相同键会覆盖原有值(SetAt 方法的特性)。
  2. 哈希表特性 :遍历顺序与插入顺序无关(哈希表不保证顺序),若需有序遍历,建议使用 CMapStringToOb 或标准库 std::map
  3. 类型匹配 :模板参数需严格匹配(尤其是字符串类型,CString 对应 LPCTSTR 作为参数类型)。
  4. 内存管理CMap 会自动管理内部存储的键值对内存,销毁对象时无需手动释放。
  5. 性能 :哈希表的查找、插入、删除效率均为 O(1)(平均情况),适合存储大量键值对。

总结

CMap 是 MFC 中高效的键值对管理工具,核心功能围绕"插入(SetAt)、查找(Lookup)、删除(RemoveKey)、遍历(GetNextAssoc)"展开。它适合需要快速根据键获取值的场景(如配置表、缓存数据),但需注意其无序性和键的唯一性约束。

相关推荐
滴_咕噜咕噜1 天前
【MFC】sqlite3数据库类导入MFC项目调用
sqlite·mfc
R-G-B1 天前
【23】MFC入门到精通——MFC资源视图 报错“在另一个编辑器中打开” ,MFC Dialog窗口消失 资源视图“在另一个编译器中打开”
c++·编辑器·mfc·“在另一个编辑器中打开”·mfc dialog窗口消失
滴_咕噜咕噜2 天前
【MFC】数据库操作:数据库动态生成
数据库·c++·mfc
R-G-B3 天前
【25】MFC入门到精通——MFC静态文本框 中字符串 连续输出 不覆盖先前的文本 换行输出
c++·mfc·mfc静态文本框输出字符串·mfc静态文本框连续输出字符串·mfc静态文本框换行输出字符串
ajassi20003 天前
开源 C++ QT QML 开发(二十三)程序发布
c++·qt·mfc
R-G-B3 天前
【21】MFC入门到精通——MFC 调试及运行状态下,使用printf() 或者 cout 打印输出信息
c++·mfc·mfc调试及运行状态下打印输出·mfc 打印输出printf·mfc打印输出cout 信息
SunkingYang6 天前
详细介绍C++中捕获异常类型的方式有哪些,分别用于哪些情形,哪些异常捕获可用于通过OLE操作excel异常
c++·excel·mfc·异常捕获·comerror
R-G-B7 天前
【35】MFC入门到精通——MFC运行 不显示对话框 MFC界面不显示
c++·mfc·mfc运行 不显界面·mfc界面不显示
深耕AI7 天前
MFC + OpenCV 图像预览显示不全中断问题解决:GDI行填充详解
c++·opencv·mfc
深耕AI8 天前
【MFC实用技巧】对话框“边框”属性四大选项:None、Thin、Resizing、对话框外框,到底怎么选?
c++·mfc