C++ Map 通过GetNextAssoc()根据value找key

本文介绍了一种在MFC中使用CMap类查找特定值对应键的方法。通过实现findMAPKeyByValue函数,可以有效地从value为字符串的map中找到对应的key。此方法对于处理MFC应用程序中的数据结构非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

map可以用find根据key来找map,现实现一个简单在MFC中value为字符串的简单map查找。

short CLBMViewerView::findMAPKeyByValue(typedef CMap<unsigned short,unsigned short,CString,CString>& map,char* c)
{
	unsigned short key;
	CString str;
	POSITION pos = map.GetStartPosition();
	while(pos!=NULL){
		map.GetNextAssoc(pos,key,str);
		if(strcmp(str,CString(c))==0)
			return key;
	}
	return -1;	//means no match key with value
}

其中POSITION是MFC模板类库中的一个数据类型,这里的作用类似于STL中的Iterator.

GetNextAssoc()的作用是取出当前迭代器位置的key和value,然后向后移动迭代器。

这里通过CString(c)直接将char *转为string,用strcmp比较取出的字符串与待寻找的字符串是否相同。

<think>好的,我需要回答用户关于MFC中GetNextAssoc方法的问题。首先,我应该回忆一下CMap类以及GetNextAssoc的作用。CMap是MFC中的一个模板类,用于存储键值对,类似于字典。而GetNextAssoc用于遍历映射中的元素。 接下来,用户需要的是使用说明和示例代码。我需要先解释方法的参数,比如POSITION和rKey、rValue的作用。然后,提供一个清晰的示例代码,展示如何声明CMap,添加元素,并进行遍历。需要注意正确使用模板参数,比如键和值的类型。 用户提供的引用中提到,使用CString作为键时,ARG_KEY应该是LPCTSTR而不是CString&,这点需要注意,避免在示例中出现错误。此外,遍历时POSITION的正确使用也很关键,比如获取第一个位置,然后循环直到位置为NULL。 还需要考虑代码的完整性,比如包含必要的头文件,比如<afxtempl.h>,以及使用正确的宏,如BEGIN_MESSAGE_MAP等,但示例代码可能不需要完整的MFC应用结构,只需聚焦在CMap的使用部分。 最后,生成的相关问题需要围绕CMap的其他方法、遍历方式、键类型选择以及常见错误,这样用户如果有进一步的问题,可以到相关的扩展内容。</think>### MFC中GetNextAssoc方法说明 `GetNextAssoc`是MFC中`CMap`类的重要方法,用于遍历哈希表中的键值对。其语法为: ```cpp void GetNextAssoc( POSITION& rNextPosition, KEY& rKey, VALUE& rValue ) const; ``` **参数说明**: - `rNextPosition`:当前遍历位置,每次调用后自动更新 - `rKey`:接收键值的引用变量 - `rValue`:接收数据值的引用变量 --- ### 示例代码:遍历CMap元素 ```cpp #include <afxtempl.h> // 定义键类型为CString,值类型为int CMap<CString, LPCTSTR, int, int&> mapData; // 添加测试数据 mapData.SetAt(_T("Apple"), 100); mapData.SetAt(_T("Banana"), 200); mapData.SetAt(_T("Cherry"), 300); // 遍历操作 POSITION pos = mapData.GetStartPosition(); CString strKey; int nValue; while (pos != NULL) { mapData.GetNextAssoc(pos, strKey, nValue); TRACE(_T("Key:%s Value:%d\n"), strKey, nValue); } ``` **输出结果**: ``` Key:Apple Value:100 Key:Banana Value:200 Key:Cherry Value:300 ``` --- ### 关键注意事项 1. **键类型选择**:使用`CString`作为键时,`ARG_KEY`应声明为`LPCTSTR`而非`CString&`[^2] 2. **遍历顺序**:元素输出顺序可能与插入顺序不一致(哈希表特性) 3. **线程安全**:遍历过程中修改映射表会导致未定义行为 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值