映射表类(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整理的更多相关文章

  1. MFC知识点整理

    1. 在使用VS2010生成基于MFC的应用程序时,在“Visual C++”下选择“MFC”,对话框中间区域会出现三个选项:MFC ActiveX Control.MFC Application和M ...

  2. std::map用法

    STL是标准C++系统的一组模板类,使用STL模板类最大的好处就是在各种C++编译器上都通用.    在STL模板类中,用于线性数据存储管理的类主要有vector, list, map 等等.本文主要 ...

  3. (转)MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)

    很早看了MFC的一些宏的实现,什么RUNTIME_CLASS, DECLARE_DYNAMIC, DECLARE_DYNCREATE,IMPLEMENT_DYNCREATE, etc,看了就烦,现在整 ...

  4. 【转】VC的MFC中重绘函数的使用总结(整理)

    原文网址:http://www.cnblogs.com/x8023z/archive/2008/12/09/mfc33.html 在刷新窗口时经常要调用重绘函数MFC提供了三个函数用于窗口重绘Inva ...

  5. 【转】MFC消息映射详解(整理转载)

    消息:主要指由用户操作而向应用程序发出的信息,也包括操作系统内部产生的消息.例如,单击鼠标左按钮,windows将产WM_LBUTTONDOWN消息,而释放鼠标左按钮将产生WM_LBUTTONUP消息 ...

  6. [项目整理]Win32,MFC的可执行文件只能运行一次

    //第一种方法:控制release版本的exe文件只能运行一次 #ifndef _DEBUG //debug 版本中,项目属性-->预处理器 -->预处理定义: 有_DEBUG if (F ...

  7. 【转】[IT综合面试]牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    感谢IT面试群 S-北京-陈磊 的整理分享.   基础篇:操作系统.计算机网络.设计模式         提高篇:WIN32.MFC与Linux 算法篇:算法与数据结构           一:操作系 ...

  8. DUILIB入门使用说明整理

    整理自博客上对DUILIB的操作使用的博客文章 一.DuiLib操作入门 1.DuiLib入门简明教程 -- 前言 2.DuiLib入门简明教程 -- VS环境配置 3.DuiLib入门简明教程 -- ...

  9. MFC程序执行顺序 .

    1.创建Application object对象theApp 程序一开始生产一个(且只有一个)Application object对象theApp,也即一个CWinApp对象,这个全局对象一产生,便执 ...

随机推荐

  1. iOS UILabel文字缩进

    使用NSMutableParagraphStyle实现label文字首尾的缩进 NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphSty ...

  2. Java UUID 生成(转载)

    来自:http://www.cnblogs.com/jdonson/archive/2009/07/22/1528466.html 基本原理:GUID是一个128位长的数字,一般用16进制表示.算法的 ...

  3. android好博客

    app集成支付宝.app缓存管理.app列表圆角设计.App自动更新之通知栏下载(有续).索引ListView.App数据格式之解析Json.拖拽ListView http://www.cnblogs ...

  4. leetcode题目解答报告(1)

    Remove Element 题目: Given an array and a value, remove all instances of that value in place and retur ...

  5. Extjs form 表单的 submit

    说明:extjs form表单的提交方式是多种多样的,本文只是介绍其中的一种方法,本文介绍的方法可能不是完美的,但是对于一般的应用应该是没有问题的.     本文包括的主要内容有:form面板设计.f ...

  6. PHP开发工作心得

    一.扎实PHP自身的基础知识.函数.常量等,尽量用内置的方法解决这个问题(由于个人写的往往运行效率没有内置方法高): 二.代码尽量少的实现功能(由于PHP的运行事实上是,将咱们的代码先处理成底层语言进 ...

  7. 让Outlook一直保持开启

    1.将OutLook.exe注册为服务,让其一直保持开启状态 类似于TaobaoProtect.exe是由TBSecSvc服务启动的 http://stackoverflow.com/question ...

  8. python字典无序?有序?

    默认情况下Python的字典输出顺序是按照键的创建顺序. 字典的无序是指,不能人为重新排序.比如说你按键值1,2,3,4的顺序创建的字典,只能由解析器按创建顺序,还是1,2,3,4的输出.你无法控制它 ...

  9. BluetoothLELibrary 支持1对1连接

    github地址:https://github.com/qindachang/BluetoothLELibrary 该库只支持1对1连接,如果你想1对多设备连接,请移步至 BluetoothLE-Mu ...

  10. 对Webview跨源攻击的理解

    首先是addJavaScriptInterface漏洞: 有时候访问手机百度贴吧网页版本,网页上会有个按钮提示用手机应用打开.这种交互通常都是使用JS来实现,而WebView已经提供了这样的方法,具体 ...