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函数就可以很快的找到你要的对象.
MFC CMap整理的更多相关文章
- MFC知识点整理
1. 在使用VS2010生成基于MFC的应用程序时,在“Visual C++”下选择“MFC”,对话框中间区域会出现三个选项:MFC ActiveX Control.MFC Application和M ...
- std::map用法
STL是标准C++系统的一组模板类,使用STL模板类最大的好处就是在各种C++编译器上都通用. 在STL模板类中,用于线性数据存储管理的类主要有vector, list, map 等等.本文主要 ...
- (转)MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)
很早看了MFC的一些宏的实现,什么RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE, etc,看了就烦,现在整 ...
- 【转】VC的MFC中重绘函数的使用总结(整理)
原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数MFC提供了三个函数用于窗口重绘Inva ...
- 【转】MFC消息映射详解(整理转载)
消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息 ...
- [项目整理]Win32,MFC的可执行文件只能运行一次
//第一种方法:控制release版本的exe文件只能运行一次 #ifndef _DEBUG //debug 版本中,项目属性-->预处理器 -->预处理定义: 有_DEBUG if (F ...
- 【转】[IT综合面试]牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
感谢IT面试群 S-北京-陈磊 的整理分享. 基础篇:操作系统.计算机网络.设计模式 提高篇:WIN32.MFC与Linux 算法篇:算法与数据结构 一:操作系 ...
- DUILIB入门使用说明整理
整理自博客上对DUILIB的操作使用的博客文章 一.DuiLib操作入门 1.DuiLib入门简明教程 -- 前言 2.DuiLib入门简明教程 -- VS环境配置 3.DuiLib入门简明教程 -- ...
- MFC程序执行顺序 .
1.创建Application object对象theApp 程序一开始生产一个(且只有一个)Application object对象theApp,也即一个CWinApp对象,这个全局对象一产生,便执 ...
随机推荐
- 分布式开源调度框架TBSchedule原理与应用
主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...
- 解读OC中的load和initialize
在 Objective-C 中,NSObject 是绝大多数类的基类.而在 NSObject 中有两个类方法 load 和 initialize,那这两个方法是在什么时机被调用呢?父类.Categor ...
- 一堂C++课玩转rpm包的制作
常见的Linux发行版主要可以分为两类,类ReadHat系列和类Debian系列,这里我们是以其软件包的格式来划分的,这两类系统分别提供了自己的软件包管理系统和相应的工具.类RedHat系统中软件包的 ...
- 获取一组radio按钮选中的值Value
1.效果 2.HTML代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...
- 九度OJ 1101:计算表达式 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4340 解决:1335 题目描述: 对于一个不存在括号的表达式进行计算 输入: 存在多种数据,每组数据一行,表达式不存在空格 输出: 输出结 ...
- python数据分析之ipython
在用python进行数据分析的时候,需要提前安装如下几个库: Numpy:是python进行科学计算的科学包 pandas:提供了能够快速便捷地处理结构化数据的大量数据结构和函数 matplotlib ...
- tornado之模板扩展
当我们有多个模板的时候,很多模板之间其实相似度很高.我们期望可以重用部分网页代码.这在tornado中可以通过extends语句来实现.为了扩展一个已经存在的模板,你只需要在新的模板文件的顶部放上一句 ...
- sdut oj 2372 Annoying painting tool (【暴力枚举测试】1Y )
Annoying painting tool 题目描述 Maybe you wonder what an annoying painting tool is? First of all, the pa ...
- BZOJ 3732 Network —— 最小生成树 + 倍增LCA
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...
- runtime之实现对象序列化
/* iOS序列化,将对象转成二进制,保存到本地 */ 定义一个对象,让它实现NSCoding协议,保证对象的编码和解码,person有三个属性 @interface Person : NSObjec ...