映射表类(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. std::map用法

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

  2. STL之Map和MFC之CMap比较学习

    在MFC中,有CMap相关的map类, 在 map中有map. // Maps (aka Dictionaries)      class CMapWordToOb;         // map f ...

  3. MFC CFileDialog使用整理

    MFC CFileDialog使用整理 1.CFileDialog构造函数 CFileDialog:CFileDialog(BOOL     bOpenFileDialog,  LPCTSTR     ...

  4. Cmap和Carray以及Cstring的使用以及MFC中的文件读写

    参考资料:百度文库http://wenku.baidu.com/view/ddd1b32558fb770bf78a55a5.html?from=search http://wenku.baidu.co ...

  5. Visual C++程序设计——MFC整理笔记

    In me the tiger sniffs the rose."  心有猛虎,细嗅蔷薇. 人心拥有猛虎和蔷薇的两面体,若缺少了蔷薇就难免变得莽撞,从而流入庸俗:若缺少了猛虎就难免变得懦弱, ...

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

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

  7. MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

    2019独角兽企业重金招聘Python工程师标准>>> 一:在VB中调用X控件,添加方法 project->Add components.另外可以用Object Browser ...

  8. mfc 判断文件夹复制完成_Python办公自动化|自动整理文件,一键完成!

    本文跟大家分享一个文件整理脚本的实现过程.具体的功能很简单,给定一个打算整理的文件夹目录,这个脚本可以将该目录下的所有文件都揪出来,并且根据后缀名归类到不同的文件夹里,就像下图一样,简直是整理爱好者的 ...

  9. VC的MFC中重绘函数的使用总结(整理)

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

最新文章

  1. 分享8个非常实用但是名气不大的软件
  2. linux下挂载windows目录
  3. Python Elasticsearch 插入数据
  4. Android中asset文件夹和raw文件夹区别
  5. sam服务器是什么_使用SAM CLI将机器学习模型部署到无服务器后端
  6. Windows Embedded CE 6.0开发初体验(三)设置Boot-loader
  7. 两个mapreduce 做topn_Apache Hive 是怎样做基于代价的优化的?
  8. mongodb数据库扩展名_MongoDB 数据库引用
  9. mysql的多媒体类型_多媒体数据库技术及其发展方向
  10. 2020最新版《神经网络与深度学习》中文版更新完毕,pdf开放下载
  11. linux 建立ssh隧道,在Linux、Windows、macOS上创建SSH隧道并通过SSH隧道连接到MySQL
  12. msvcp71.dll、msvcr71.dll丢失解决方法
  13. 朱乐睿_校友风采_师范大学企业管理专业
  14. lumion建筑可视化2.5小时的真实感渲染教程
  15. wex5 导入mysql_Wex5铛铛开发环境搭建步骤
  16. 生于忧患,死于安乐。
  17. postgresql -- 绑定变量窥视规则
  18. 湖南生物机电职院信息技术学院召开第一届思政工作会议
  19. 集合类 Java中的集合类解析和一些有深入的面试题
  20. 建木(Jianmu)----迈出建木第一步创建项目分组

热门文章

  1. 你不懂js系列学习笔记-类型与文法- 04
  2. Swt/Jface中提供的dialog
  3. 理解同步异步、阻塞与非阻塞
  4. [连载]JavaScript讲义(05)--- 数据处理
  5. 【OpenCV学习】内存分配讨论两例
  6. 推荐一款非常不错的子网计算器
  7. 激光雷达选型指南 这2项重要指标却被很多人忽略
  8. AliOS Things v1.2.0新特性
  9. Hyper-V虚拟机快照占用磁盘空间过多,导致虚拟机不能启动怎么办
  10. UVA 12063 Zeros and Ones