MFC - CMap

本文介绍了MFC集合类中的CMap模板类,包括构造、基本操作如查找、插入、删除等,以及如何遍历和使用示例。CMap类似于C++ STL中的map或hashmap,用于实现字典功能。

映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”。 类似于c++ STL map或hashmap

#include <afxtempl.h>

构造

CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>

操作:

Lookup:查找与指定关键码对应的值

SetAt:在映射中插入一个元素,如果发现相匹配的关键码,则替换已经存在的元素

Operator[]:在映射中插入一个元素,它是代替SetAt的操作符

RemoveKey:删除关键码指定的元素

RemoveAll:删除映射中所有的元素

GetStartPosition:返回第一个元素的位置

GetNextAssoc:获取循环中的下一个元素

GetHashTableSize:获取散列表的大小(元素的个数)

InitHashTable:初始化散列表,并指定其大小

状态:

GetCount:返回Map中元素的数目

IsEmpty:检查Map是否为空(即字典中无元素单元)

 

示例:

1.定义一个CMap,向这个CMap中增加数据项(键-值对)

CMap<CString,LPCTSTR,CString,LPCTSTR> Map;

CString strKey = _T(""),strValue = _T("");

int i;

for(i=0;i<5;i++){

    strKey.Format("%d",i);

    strValue.Format("V%d",i);

    Map.SetAt(strKey,strValue);

}

2.遍历整个CMap的常用方法

POSITION pos = Map.GetStartPosition();

while(pos){

    Map.GetNextAssoc(pos,strKey,strValue);

    cout<<strKey<<":"<<strValue<<endl;

}

3.在CMap中查找相对应的数据项(举例查找关键字"1"对应的键值)

CString pLook;

if(Map.Lookup("1",pLook)){

    cout<<pLook<<endl;

}

备注: CMap的声明模式CMap<KEY,ARG_KEY,VALUE,ARG_VALUE> 很难理解,为什么不像c++ STL的声明直接是CMap<Key,Value>?实际上,CMap中数据最终会是CPair,而CPair即为(KEY,VALUE),因此,CMap其实存储的是KEY,而不是ARG_KEY

转载于:https://www.cnblogs.com/reboost/p/10594667.html

<think>嗯,用户想了解MFCCMap类的GetNextAssoc方法的使用示例。首先,我需要回忆CMap的基本结构和用法。根据之前的引用,CMap是一个模板类,类似于STL的map,但实现方式可能不同。用户提到的GetNextAssoc方法用于遍历CMap中的元素,这在处理映射表时很常见。 接下来,我应该考虑如何正确声明CMap实例。例如,引用[2]中提到,声明时需要指定键和值的类型,比如CMap<int, int, CString, CString>。所以,在示例代码中,应该先声明一个这样的映射,并添加一些元素,如SetAt方法插入键值对。 然后,使用GetNextAssoc进行遍历。根据文档,遍历通常需要一个POSITION变量来跟踪当前位置。遍历开始时,调用GetStartPosition获取初始位置,然后在循环中调用GetNextAssoc,直到位置为NULL。需要注意的是,每次调用GetNextAssoc后,POSITION会更新到下一个元素。 用户可能需要具体的代码示例,所以应该提供一个完整的例子,包括CMap的初始化、添加元素和遍历过程。同时,要指出在遍历过程中键值对的顺序可能不确定,因为CMap是基于哈希表实现的,这点和STL的map不同。 另外,引用[3]和[4]提到CMap可以存储任意类型的键和值,所以在示例中可以选择常见的类型组合,比如int和CString,让用户容易理解。还要提醒用户包含必要的头文件,比如afxtempl.h,以及确保项目支持MFC。 最后,检查示例代码的正确性,确保语法正确,比如使用正确的模板参数,循环结构正确,以及使用正确的成员函数。可能还需要提到在使用GetNextAssoc时,参数的正确顺序:先传入POSITION,然后是键和值的引用。</think>### MFC CMap GetNextAssoc 方法使用示例 #### 功能说明 `GetNextAssoc` 是 CMap 类中用于遍历映射表元素的核心方法,其作用是通过 `POSITION` 定位逐项获取键值对[^2][^3]。该方法特别适合需要遍历哈希表但不需要排序的场景。 #### 实现步骤 1. **声明 CMap 实例** ```cpp CMap<int, int, CString, CString> mapData; // 键类型:int,值类型:CString mapData.SetAt(1, _T("Apple")); // 插入键值对 mapData.SetAt(2, _T("Banana")); ``` 2. **遍历核心代码** ```cpp POSITION pos = mapData.GetStartPosition(); // 获取起始位置 int nKey; CString strValue; while (pos != NULL) { mapData.GetNextAssoc(pos, nKey, strValue); // 自动更新pos到下一项 TRACE(_T("Key:%d => Value:%s\n"), nKey, strValue); } ``` #### 关键特性 - **无序性**:遍历顺序不保证插入顺序一致,由哈希表结构决定[^1] - **参数顺序**:需按`(POSITION, KEY, VALUE)`顺序传入参数 - **头文件依赖**:需包含 `<afxtempl.h>` #### 典型应用场景 - 调试时查看哈希表内容 - 批量修改/导出映射表数据 - 统计键值对数量(需配合`GetCount`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值