zoukankan      html  css  js  c++  java
  • 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函数就可以很快的找到你要的对象.  

  • 相关阅读:
    比较两个集合元素是否相同?
    如何将list集合转成String对象
    如何对金额进行判断
    微信网页授权
    什么是微信小程序?简单介绍
    关于买家买入一件商品以后需要进行的逻辑
    设置快捷的模板的生成
    IDEA优秀插件分享之---Mybatis Log Plugin
    破解Beyond Compare 4
    JPA-save()方法会将字段更新为null的解决方法
  • 原文地址:https://www.cnblogs.com/lpxblog/p/5010069.html
Copyright © 2011-2022 走看看