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

来源:互联网 发布:mac怎么制作iphone铃声 编辑:程序博客网 时间:2024/06/09 18:15
 

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,但是发现不管用,也许是我的工程中文件太多,包含关系太复杂。新建了一个最简单的工程试了一下可以。

原创粉丝点击