映射表类(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. HTML marquee标签

    marquee语法    <marquee></marquee> 实例一<marquee>Hello, World</marquee> marquee常 ...

  2. return和exit的差别

    #include<stdio.h> #include<sys/types.h> #include<sys/wait.h> #include<unistd.h& ...

  3. 【转】Android IDA 动态调试最完善攻略,跨过各种坑

    前提条件和运行环境一定要写清楚,不然会有很多坑,坑死人. (1)IDA 是最新的7.0版本  (2) JDB 使用Java安装目录下的 (3)系统是win10 使用命令窗口时有很大的差别 (4)手机是 ...

  4. 初步探讨WPF的ListView控件(涉及模板、查找子控件) - GavinJun

    本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmln ...

  5. ffmpeg推送,EasyDarwin转发,vlc播放 实现整个RTSP直播

    部署EasyDarwin流媒体服务器 ffmpeg推送摄像机视频到EasyDarwin VLC播放 第一步:部署EasyDarwin流媒体服务器 EasyDarwin的部署过程我们就不再赘述了,在Ea ...

  6. 判断一个IP地址是否是本局域网内地址

    //        /// <summary>        /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false,        /// </summa ...

  7. kong

    https://docs.konghq.com/install/centos/ wget https://bintray.com/kong/kong-community-edition-rpm/dow ...

  8. Java Virtual Machine (JVM) objects 虚拟机实例的产生 退出 两种线程

    Apache Spark is built around a distributed collection of immutable Java Virtual Machine (JVM) object ...

  9. 简单老式Java对象 横切关注点 最小侵入性编程 声明式编程 避免强迫类继承和接口实现

    Spring In Action data injection aspect-oriented programming Plain Old Java Object 依赖注入能让相互协作的软件组件保持松 ...

  10. UI标签库专题四:JEECG智能开发平台 Upload(上传标签)

     1. Upload(上传标签) 1.1.  參数 属性名 类型 描写叙述 是否必须 默认值 id string 上传控件唯一标示 是 null name string 控件name 是 null ...