CMap map

来源:互联网 发布:nginx htaccess 编辑:程序博客网 时间:2024/05/29 14:29

在MFC中,有CMap相关的map类, 在 map中有map。

// Maps (aka Dictionaries)
     class CMapWordToOb;         // map from WORD to CObject*
    class CMapWordToPtr;        // map from WORD to void*
   class CMapPtrToWord;        // map from void* to WORD
   class CMapPtrToPtr;         // map from void* to void*

// Special String variants
   class CMapStringToPtr;      // map from CString to void*
  class CMapStringToOb;       // map from CString to CObject*
   class CMapStringToString;   // map from CString to CString

 

对于以上可以直接用stl中的一个map类型全部概况。

map<Word, CObject*>

map<Word, void*>

map<void*, Word>

map<void*, void*>

map<CString,void*>

map<CString, CObject*>

map<CString, CString>

由此,还是map简练。

再看遍历时,各个处理如下:

CMap<DWORD, DWORD&, ThreadInfo, ThreadInfo&> m_threadMap;   //定义一组线程map

则在

ThreadInfo info;

DWORD Key ;
POSITION pos = threadMap.GetStartPosition();
while (pos != NULL)
{

    threadMap.GetNextAssoc(pos, Key, info);
    { 
     。。。
    }
}

如果采用std中的map处理则

map<DWORD ,ThreadInfo>m_threadMap;

map<DWORD ,ThreadInfo>::iteraotr pIt;

for(pIt = m_threadMap.begin(); pIt != m_threadMap.end(); pIt++){

     ......

}

 

简单明了,胜过用mfc中繁芜而又不清晰的过程。所以多用std做程序开发比用一些过时的要好得多。

何须浪费时间去知道几个茴字的写法呢。是不是。

     以上内容转自http://blog.csdn.net/gaoxiaowei/article/details/2802171

   VC的CMap类和STL的map的使用及使用过程中遇到的错误

1、 CMap类:

映射表类(CMap)是MFC集合类中的一个模板类,它是对Hash表的一种实现,也称作为“字典”,就像一种只有两列的表格,一列是关键字,一列是数据项,它们是一一对应的,。

关键字是唯一的,给出一个关键字,映射表类会很快找到对应的数据项。映射表的查找是以哈希表的方式进行的,因此在映射表中查找数值项的速度很快。映射类最适用于需要根据关键字进行快速检索的场合,他这个有点像数组,比如你要查找a[index],不必先遍历前面的index个元素,只不过数组的下标是哈希表键值,它是以键值对的形式出现的。

Class member:

Lookup

查找与指定关键码对应的值

SetAt

在映射中插入一个元素,但假如发现了相匹配的关键码,则替换已经存在的元素

operator []

在映射中插入一个元素,它是代替SetAt的操作符

RemoveKey

删除关键码指定的元素

RemoveAll

删除映射中所有的元素

GetStartPosition

返回第一个元素的位置

GetNextAssoc

获取循环中下一个元素

GetHashTableSize

返回散列表的大小(元素的个数)

InitHashTable

初始化散列表,并指定其大小

2、 使用CMap遇到的问题:

在使用过程中发现,Key只能是long型的或者是能转换成long型的数据,我使用CSting型时出现错误:cannot convert from 'class CString' to 'unsigned long',跟踪到错误处:

template<class ARG_KEY>

AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)

{

    // default identity hash - works for most primitive values

    return ((UINT)(void*)(DWORD)key) >> 4;

}

就算是把Key设为INT64型的也只能比较低32位,所以准备改用STL的map。

3、 STL的map:

map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在处理一对一数据时,在编程上提供快速通道。介绍一下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

#include <map>

#include <string>

Using namespace std;

map<string,int> STRING2INT

基本操作:

[]:赋值或插入,find:查找,insert:插入,erase:删除。

用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作插入失败,但是用[ ]操作符,它可以覆盖以前该关键字对应的值。

2 、使用map遇到的问题:

(1)MSVCP60.dll错误:编译、链接都没错,Debug模式下运行时出错,MSVCP60.dll错误,网上查资料发现是使用string的原因,最后改为map<INT64,int> INT642INT,没问题了。

(2)warning 4678太多:标准库中的标志符超长了,在所有#include之前加入#pragma warning( disable : 4786 )

   屏蔽掉这类warning,但是发现不管用,也许是我的工程中文件太多,包含关系太复杂。新建了一个最简单的工程试了一下可以。

以上内容转自http://apps.hi.baidu.com/share/detail/18154747

原创粉丝点击