CMap用法

清泛原创
先上实例:
int _tmain(int argc, char* argv[])
{
	//定义
	typedef CMap<int, int, CString, CString> CMapInt;

	CMapInt map;

	//添加key,val
	map.SetAt(1, "str1");
	map.SetAt(2, "str2");
	map.SetAt(3, "str3");

	map.SetAt(1, "str11"); //把str1覆盖了

	//查找(方法一:Lookup)
	CString str;
	if (map.Lookup(1, str))
	{
		printf("find:%s\n", str);
	}

	//查找(方法二:PLookup)
	CMapInt::CPair* pPair = map.PLookup(1);
	if (pPair)
	{
		printf("find:%s\n", pPair->value);
	}

	//遍历
	CMapInt::CPair* pCurValue=  map.PGetFirstAssoc();
	while(pCurValue != NULL)
	{
		printf("key:%d, val:%s\n", pCurValue->key, pCurValue->value);

		pCurValue = map.PGetNextAssoc(pCurValue);
	}

	//删除一个元素
	map.RemoveKey(1);

	//删除所有元素
	map.RemoveAll();

	return 0;
}
CMap在用CString做key类型时,ARG_KEY要选LPCTSTR
遇到好几个人说CMap在用CString做key类型时有问题,说用int和DWORD就可以,用CString就不行。因此很多人推荐使用MFC中的CMapStringToPtr之类。关键是ARG_KEY要选LPCTSTR,否则编译报错。
CMap<CString, LPCTSTR, int, int> typeMap;
typeMap.SetAt(_T("ONE"), 1);
typeMap.SetAt(_T("TWO"), 2);
//其余用法同上例



CMap的用法:

 

头文件:

afxtempl.h

 

CMap的格式:

template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap : public CObject

 

Key:用作Key的类型(比如整型、浮点型等)

ARG_KEY:Key的值

VALUE: 用作VALUE的类型

ARG_VALUE:用作VALUE的值

参数:  

KEY对象的类,用作映射的关键码。ARG_KEY参数KEY使用的数据类型,通常为KEY的参考。VALUE存储在映射中对象的类。ARG_VALUE参数VALUE使用的数据类型,通常为VALUE的参考。

 

说明:

CMap是把唯一关键码映射到值的字典收集类。一旦在映射中插入了一个关键码值对(元素),就可以使用这些关键码,有效地获取或删除对。同样,也可以反复使用映射中的所有元素。

POSITION类型变量用于替换所有映射变量的入口。可以使用POSITION来“记忆”入口和映射中的遍历。可能认为这种遍历是通过关键码值来依次进行的,但其实不是。获取元素的次序没有确定。

该类的某些成员函数调用了全局的帮助函数,它们必须定制,以满足CMap类的更多用途。请参阅“Microsoft Visual C++ MFC库参考”中的“宏和全局”部分中的“收集类帮助程序”。

CMap引入了宏IMPLEMENT_SERIAL,支持其元素的串行化和转储。如果映射存储到档案文件中,那么每一元素都可利用加载插入(<<)操作符或Serialize成员函数来依次进行串行化。如果要了解有关在映射中进行个别元素的诊断转储,那么转储内容的深度必须为1或更大。当CMap对象删除或其元素被删除,那么关键码和值都将被删除。映射类的派生与列表的派生相似。

 

为什么使用CMap:

如果你要存储的每个数据至少有一个唯一的标志(数字、字符、字符串、类的对象。。。),并且这些数据会频繁的被查找和替换。那么你就需要使用CMap类来简化你的代码,提高你的效率。

CMap就是对Hash表的一种实现。对于Hash表来说,我们需要提供成对的Key与Value进行操作,其实,也就是将我们日常使用的数组下标替换成现在Key,这样就方便我们使用key来查找到相应的Value,提高我们遍历的速度。至于MFC是采用了什么样的散列函数,我们不必知道。

CMap

分享到:
评论加载中,请稍后...
创APP如搭积木 - 创意无限,梦想即时!
回到顶部