映射表类(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. android mvp高速开发框架介绍(dileber的简单介绍)

    今天我为大家介绍一款android mvp框架:dileber(https://github.com/dileber/dileber.git) 官方交流qq群:171443726 我个人qq:2971 ...

  2. input输入框输入大小写字母自动转换

    input输入框输入小写字母自动转换成大写字母有两种方法 1.用js onkeyup事件,即时把字母转换为大写字母: html里input加上 <input type="text&qu ...

  3. 关于erlang解析json数据

    JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读.json的数据格式是文本文档格式的一种.在erlang中可以参考mochiwe ...

  4. PythonCookBook笔记——数字日期和时间

    数字日期和时间 数字的四舍五入 用round函数,指定值和小数位数. >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 & ...

  5. php判断某字符串是否不以数字或其他特殊字符开头

    if(preg_match("/^[^\d-.,:]/",$addr)){ echo $addr.'不是数字或其他特殊字符开头'; }

  6. [不好分类]iphone手机激活错误的处理过程

    同事一台iphone 6s手机,重启后显示无法激活.(欢迎访问viphhs,欢迎转载.https://www.cnblogs.com/viphhs) 百度后尝试更换了手机卡,重新连接wifi,都不能恢 ...

  7. 基于XML配置的Sping AOP详解

    一.编写基本处理方法 package com.kang.sping.xml.aop; public class Math{ //加 public int add(int n1,int n2){ int ...

  8. java socket相关的timeout

    1 java socket的两个timeout 一个是connect timeout,即建立连接的timeout,另外一个是so timeout,是读取数据的timeout.这两个timeout都是因 ...

  9. sort_action

    li, r = [23,8, 45, 5, 0, -6, 745,8, 8], [] while (len(li) > 0): loop_, min, tag = len(li), li[0], ...

  10. mapper代理(十一)

    原始 dao开发问题 1.dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量. 2.调用sqlsession方法时将statement的id硬编码了 3.调用s ...