VC++ 中CMap的简介和简单实例!

最近在mfc中用到字典,自己不会在网上查了资料。简单总结一下:
一,CMap是什么?
      映射(Map),又称为字典(Dictionary),是由关键字(Key)及其对应的元素值(Value)所组成的元素单

元(Element)的表单式集合。CMap是一个mfc的模板类,可以建立一个从任意类型的变量到另外一个任意类型的

变量的映射(map),用的是哈希表作存储,因此速度较快。对于要求查找速度快一般用数组,对于增加/删除操作

方便的都用链表,但要是两者综合一下,最好还是用合希表。

 

二,要注意的几个地方:
   1.如何声明CMap
          许多人对Cmap的声明模式CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>感到迷惑,为什么不用CMap<KEY,VALUE> 

   呢?实际上,CMap中的的数据最终会是CPair,而CPair内部是(KEY,VALUE)。因此,CMap其实存储的是KEY

   ,而非ARG_KEY。然而,如果你查看MFC的源代码,几乎CMap所有的内部参数传递都是访问ARG_KEY和ARG_VALUE,因此,使用KEY&来代替ARG_KEY似乎是正确的,除了在这些情况下:
     1 应用简单的数据类型,如int ,char用值传递与参数传递没有什么不同
     2 如果用CString作为KEY,你应该用LPCTSTR做ARG_KEY而非CString&。

  2.有哪些与Map相关的典型操:

  1 向Map中插入具有给定关键字的元素单元。

  2 在Map中查找具有给定关键字的元素单元。

  3 在Map中删除具有给定关键字的元素单元。

  4 枚举(遍历)Map中的所有元素单元。

  
三,简单的例子:
   例子一: 我们来看一个CMap的用法,下面示例代码:

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

 //初始化哈希表,并指定其大小(取奇数)。MyMap.InitHashTable(257);

 //向myMap中添加元素单元。
 for (int i=0;i < 200;i++)
   myMap.SetAt( i, CPoint(i, i) );

  // 删除实际值为偶数的关键字所对应的的元素单元。
 POSITION pos = myMap.GetStartPosition();
 int nKey;
 CPoint pt;
 while (pos != NULL)
 {
  myMap.GetNextAssoc( pos, nKey, pt );

  if ((nKey%2) == 0)
   myMap.RemoveKey( nKey );
 }

 #ifdef _DEBUG
  afxDump.SetDepth( 1 );
  afxDump << "myMap: " << &myMap << "/n";CMap<int,int&,CPoint,CPoint&> myMap;

//初始化哈希表,并指定其大小(取奇数)。MyMap.InitHashTable(257);

//向myMap中添加元素单元。
for (int i=0;i < 200;i++)
 myMap.SetAt( i, CPoint(i, i) );

 // 删除实际值为偶数的关键字所对应的的元素单元。
 POSITION pos = myMap.GetStartPosition();
 int nKey;
 CPoint pt;
 while (pos != NULL)
 {
  myMap.GetNextAssoc( pos, nKey, pt );

  if ((nKey%2) == 0)
   myMap.RemoveKey( nKey );
 }

 #ifdef _DEBUG
  afxDump.SetDepth( 1 );
  afxDump << "myMap: " << &myMap << "/n";


CMap是个很不错的数据结构,尤其在你建立一个字典的时候。比如idcountry的含义是"中国",这就是一个元组

,也就是一个Pair,Key是"idcountry",而Value是"中国"。

例子二:

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;
    }

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值