MFC CMap整理
映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”。CMap是把唯一关键码映射到值的字典收集类,使用CMap可以构造一个关键字和元素值映射的集合类。一旦在映射中插入了一个关键码值对(元素),就可以使用这些关键码,有效地获取或者删除对元素。同样,也可以反复使用映射中的所有元素。 就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。映射类最适用于需要根据关键字进行快速检索的场合。在查找时不用像数组那样遍历index之前的元素,通过哈希表关键字可以快速查找其对应键值。
#include <afxtempl.h>
CMap类的成员:
构造函数:CMap
操作:
Lookup:查找与指定关键码对应的值
SetAt:在映射中插入一个元素,如果发现相匹配的关键码,则替换已经存在的元素
Operator[]:在映射中插入一个元素,它是代替SetAt的操作符
RemoveKey:删除关键码指定的元素
RemoveAll:删除映射中所有的元素
GetStartPosition:返回第一个元素的位置
GetNextAssoc:获取循环中的下一个元素
GetHashTableSize:获取散列表的大小(元素的个数)
InitHashTable:初始化散列表,并指定其大小
状态:
GetCount:返回Map中元素的数目
IsEmpty:检查Map是否为空(即字典中无元素单元)
举例如下:
1.定义一个CMap,向这个CMap中增加数据项(键-值对)
CMap<CString,LPCTSTR,CString,LPCTSTR>my_Map;
CString strKey = _T(""),strValue = _T("");
int i;
for(i=0;i<5;i++)
{
strKey.Format("%d",i);
strValue.Format("V%d",i);
my_Map.SetAt(strKey,strValue);
}
2.遍历整个CMap的常用方法
POSITION pos = myMap.GetStartPosition();
while(pos)
{
myMap.GetNextAssoc(pos,strKey,strValue);
cout<<strKey<<":"<<strValue<<endl;
}
3.在CMap中查找相对应的数据项(举例查找关键字"1"对应的键值)
CString pLook;
if(myMap.Lookup("1",pLook))
{
cout<<pLook<<endl;
}
PS:可能有人会对CMap的声明模式CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>觉得有些不容易理解,有点迷惑,觉得CMap的声明为什么不是CMap<Key,Value>呢?实际上,CMap中的数据最终会是CPair,而CPair即为(KEY,VALUE),因此,CMap其实存储的是KEY,而不是ARG_KEY。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CMap CMapStringToOb具体应用
映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。举个例子来说吧,公司的所有职员都有一个工号和自己的姓名,工号就是姓名的关键字,给出一个工号,就可以很快的找到相应的姓名。映射类最适用于需要根据关键字进行快速检索的场合。
CMapWordToPtr 保存void指针,关键字为WORD
CMapPtrToWord 保存WORD,关键字为void指针
CMapPtrToPtr 保存void指针,关键字为其它void指针
CMapWordToOb 保存CObject指针,关键字为WORD
CMapStringToOb 保存CObject指针,关键字为字符串
CMapStringToPtr 保存void指针,关键字为字符串
CMapStringToString 保存字符串,关键字为字符串
声明:CMap<SOCKET, SOCKET, char*, char*> m_SockToUserIDMap;
CMap<char*, char*, SOCKET, SOCKET> m_UserIDToSockMap;
赋值:m_SockToUserIDMap[pUserInfo->sSocket] = pszUserID;
m_UserIDToSockMap[pszUserID] = pUserInfo->sSocket;
取值:char *pszUserID = m_SockToUserIDMap[sSock];
SOCKET sSock = m_UserIDToSockMap[pszUserID];
此处略去CMyData的代码。
以下演示CMap的基本用法,其它的也都差不多的用法,只是其中元素变一变。
//定义类型
typedef CTypedPtrMap<CMapStringToOb,CString,CMyData*> CMapDataMap;
//定义实例
CMapDataMap m_map;
//添加
CMyData *pData=new CMyData;
m_map.SetAt("abc", pData); //abc对应pData
//再使用abc查找刚才放进去的CMyData
CMyData *pResult=NULL;
if(m_map.Lookup ("abc", pResult))
{
//找到了...
}
//删除
CMyData *pResult=NULL;
if(m_map.Lookup("abc", pResult))
{
m_map.RemoveKey("abc");
delete pResult;pResult=NULL;
}
//删除CMap中所有项
POSITION pos=map.GetStartPosition();
CString szKey="";
CMyData *pData=NULL;
while(pos!=NULL)
{
m_map.GetNextAssoc(pos, szKey, pData);
delete pData;pData=NULL;
}
m_map.RemoveAll();
Map通常是为了查找才使用的,比如你有一个链表List, 其中记录了10000个对象,每个对象都有一个不同的ID.这时,你要查找指定ID的对象,如果使用List,则你必须遍历整个List,看看那个对象的ID相同.随着对象数目的增加,此操作效率将非常低.因此,最后建立一个Map,并进行维护.
CMap<int, int, CMyObject*, CMyObject*>MyIDMap;
此时, 你用CMap::Lockup函数就可以很快的找到你要的对象.
最新文章
- 一个简单的游戏开发框架(七.动作Motion)
- 导航position:absolute
- Strong TLS configuration on servers
- shell操作mysql
- @Transactional失效的问题
- 分支-15. 日K蜡烛图(15)
- Javscript的垃圾回收
- 【BZOJ5316】[JSOI2018]绝地反击(网络流,计算几何,二分)
- js静态方法与实例方法定义,js回调方法定义
- dubbo @Activate 注解使用和实现解析
- 谈谈canvas的性能优化(主要讲缓存问题)
- Netty 高性能之道 FastThreadLocal 源码分析(快且安全)
- lambda,sorted(),filter(),map(),递归,二分法
- 个人tools封装
- 修改 Hue 默认数据库
- 留言板(初学者使用js实现)
- Orchard运用 - 网站样例
- PyQt 5菜单和工具栏
- 第二章 IP协议详解
- Android实现截图分享qq,微信
热门文章
- 按照eslint 规范写代码 [eslint] &#39;flag&#39; is assigned to itself. (no-self-assign)
- 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转
- 13.JavaScript 类
- Protocol_OSPF
- Python升级已经安装的第三方库
- maven项目所遇到的问题解决
- rkhunter和chkrootkit
- BZOJ2006:超级钢琴(ST表+堆求前K大区间和)
- 如何理解Web应用程序的MVC模型?
- poi word 转html (.DOC .DOCX )