文章类型: VC&C++
关键词: VC++,CMAP,用法
内容摘要: VC++中CMAP用法

VC++中CMAP用法

2017/5/12 16:10:24    来源:apple    阅读:

映射表类(CMap)是MFC集合类中的一个模板类,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的。关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。映射类最适用于需要根据关键字进行快速检索的场合,我们的程序中就用映射表来保存计时器标志值和类实例指针,用计时器的标志值作为关键字。 他这个有点像数组,比如你要查找a[index],不必先遍历前面的index个元素,只不过数组的下标是哈希表键值,它是以键值对的形式出现的。


参数:  

    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();


再举例说明如下:

1、定义一个CMAP,向这个CMAP中增加数据项(键-值对)。

CMap<CString, LPCTSTR, CString, LPCTSTR>m_ItemMap;

CString strKey = _T(""), str = _T("");

int i;

for(i = 0; i < 5; i++)

    {

        strKey.Format("%d", i);             //这个是键

        str.Format("A%d", i);              //键对应的值 

        m_ItemMap.SetAt(strKey, str);

    }

2、遍历整个CMAP的常用方法。

    POSITION pos = m_ItemMap.GetStartPosition();

    while(pos)

    {

        m_ItemMap.GetNextAssoc(pos, strKey, str);

        cout<< strKey<< ":"<< str<< endl;

    }

3、在CMAP中查找相应的数据项。

    CString pReset;

    if(m_ItemMap.Lookup("1", pReset))

    {

        cout<<pReset<<endl;

    }

↑ 上一篇文章:VC 字符串的相互转换 CString 和 unsigned char* 关键词:如何将CString类型转换成unsigned,char.. 发布日期:2017/5/12 16:07:08
↓ 下一篇文章:SQL Server 附加数据库提示5120错误 关键词:SQL,Server,附加数据库提示5120错误 发布日期:2017/5/14 21:18:03
相关文章:
(VC++) CString Format的用法 关键词:VC++,CString,Format,用法,windows,MFC,程序,C++ 发布日期:2016-10-24 11:12
VC++中CMap的使用 关键词:VC++,CMap,Lookup,SetAt,GetStartPosition,GetNextA.. 发布日期:2017-10-17 14:38
vc++中的vector的用法和C#中的List的详细用法 关键词:vc,vc++,c++,vector,用法,List,C#,C,Sharp 发布日期:2019-01-24 15:16
相关目录:.NETVC&C++JAVA软件开发
我要评论
正在加载评论信息......