zoukankan      html  css  js  c++  java
  • CMap的使用(转)

    CMap的使用

    参数:  

        KEY对象的类,用作映射的关键码。ARG_KEY参数KEY使用的数据类型,通常为KEY的参考。VALUE存储在映射中对象的类。ARG_VALUE参数VALUE使用的数据类型,通常为VALUE的参考。

     

    说明:

      CMap是把唯一关键码映射到值的字典收集类。一旦在映射中插入了一个关键码值对(元素),就可以使用这些关键码,有效地获取或删除对。同样,也可以反复使用映射中的所有元素。

      POSITION类型变量用于替换所有映射变量的入口。可以使用POSITION来“记忆”入口和映射中的遍历。可能认为这种遍历是通过关键码值来依次进行的,但其实不是。获取元素的次序没有确定。

      该类的某些成员函数调用了全局的帮助函数,它们必须定制,以满足CMap类的更多用途。请参阅“Microsoft Visual C++ MFC库参考”中的“宏和全局”部分中的“收集类帮助程序”。

      CMap引入了宏IMPLEMENT_SERIAL,支持其元素的串行化和转储。如果映射存储到档案文件中,那么每一元素都可利用加载插入(<<)操作符或Serialize成员函数来依次进行串行化。如果要了解有关在映射中进行个别元素的诊断转储,那么转储内容的深度必须为1或更大。当CMap对象删除或其元素被删除,那么关键码和值都将被删除。映射类的派生与列表的派生相似。

     

    为什么使用CMap:

        如果你要存储的每个数据至少有一个唯一的标志(数字、字符、字符串、类的对象。。。),并且这些数据会频繁的被查找和替换。那么你就需要使用CMap类来简化你的代码,提高你的效率。

        CMap就是对Hash表的一种实现。对于Hash表来说,我们需要提供成对的Key与Value进行操作,其实,也就是将我们日常使用的数组下标替换成现在Key,这样就方便我们使用key来查找到相应的Value,提高我们遍历的速度。至于MFC是采用了什么样的散列函数,我们不必知道。

     

    CMap的用法:

     

    头文件:

    afxtempl.h

     

    CMap的格式:

    template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE >class CMap : public CObject

     

    Key:用作Key的类型(比如整型、浮点型等)

    ARG_KEY:Key的值

    VALUE: 用作VALUE的类型

    ARG_VALUE:用作VALUE的值

     

    1. 要使用Cmap,那么首先我们要实例化一个CMap的类型

    举例:

    typedef CMap<int, int, CString, CString>     CMapPnt; //比如学生名册的列表

    typedef CMao<CPoin, CPoin,CTime, CTime>   CMapTime;//比如不同经纬度的时间

    typedef CMap<CMyType, CMyType, CThing, CThing> CMyThing; //比如自己的私有物品的列表

     

    任何类型都可以用作key或者value的类型。但是正如我们前面所说,key是一个唯一的标志,用以加快我们的查询速度。

     

    2.我们举例来说明CMap的查询、遍历、删除等用法。

    比如一个班级的花名册,那么学生的学号是唯一的,所以我们有了下面这个CMap的实例。

    在使用之前声明:

    typedef CMap<int,   int,   CString,   CString>   CMapStu;

       

    使用时,我们认为CMapStu是一个类型就可以了。

    CMapStu m_class1; //班级1

     

    3.添加:void SetAt(ARG_KEY key, ARG_VALUE newValue); 此函数会以Key值遍历列表,当查找到key值后使用newValue替换以前的Value值。如果没有找到key值,则添加此项。

     m_class1.SetAt(001,     "张三");  

     m_class1.SetAt(002,     "张A");  

     m_class1.SetAt(003,     "张B");  

     m_class1.SetAt(004,     "张C");

     

    4.查找:Lookup(ARG_KEY key, ARG_VALUE& newValue)如果找到Key值,则newValue等于其存储的Value值,返回值为非0。 如果未找到,则返回值为0.

    int studentId = 1;

    CString studentName;

    if (m_class1.Lookup(studentId, studentName))

    {

        AfxMessageBox("ID号: %d, 姓名: %s", studentId, studentName);

    }

     

     

    5.遍历:CMap提供了专门用作遍历的类型CPair,CPair顾名思义,就是一对。其中包含一个Key和对应的Value。

    CMapStu::CPair* pCurValue=  m_class1.PGetFirstAssoc();  

    while(pCurVal != NULL)  

    {  

        CString str;

        str.Format("学号: %d, 姓名:%s", pValue->key, pValue->value);

           

         pCurValue = m_class1.PGetNextAssoc();

    }  

     

    6.删除一个元素:RemoveKey(ARG_KEY key) 

    如果当前Key值存在,则返回非0值,如果不存在,则返回0值。

    int studentId = 1;

    RemoveKey(1); //删除学号为1的学生信息

     

    7.删除所有元素:RemoveALL()

    CMap<int,int,CPoint,CPoint> myMap;

     

    // Add 10 elements to the map.

    for (int i=0;i < 10;i++)

       myMap.SetAt( i, CPoint(i, i) );

     

    myMap.RemoveAll();

  • 相关阅读:
    .net注册iis
    hdu 1081To The Max
    hdu 1312Red and Black
    hdu 1016Prime Ring Problem
    hdu 1159Common Subsequence
    hdu 1372Knight Moves
    hdu 1686Oulipo
    hdu 1241Oil Deposits
    hdu 1171Big Event in HDU
    hdu 4006The kth great number
  • 原文地址:https://www.cnblogs.com/gr816/p/7851099.html
Copyright © 2011-2022 走看看