在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

STL之Map和MFC之CMap比较学习相关推荐

  1. c++ map是有序还是无序的_C++ STL中Map的按Key排序和按Value排序

    map是用来存放键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义 ...

  2. STL之map中排序方式的重载

    map中的数据默认是按key值字典序排的 栗子: #include <iostream> #include <map> using namespace std; //typed ...

  3. stl中map函数_map :: empty()函数以及C ++ STL中的Example

    stl中map函数 C ++ STL映射:: empty() (C++ STL map::empty()) It is built-in function in C++ STL and used to ...

  4. STL 中map的用法详解

    STL 中map的用法详解 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可 ...

  5. stl中map函数_map :: max_size()函数,以及C ++ STL中的Example

    stl中map函数 C ++ STL映射:: max_size() (C++ STL map::max_size() ) It returns the maximum number of elemen ...

  6. 转 STL hash_map map

    几句话道出map和hash_map的区别 1. STL map is an associative array where keys are stored in sorted order using ...

  7. C++ STL中Map的按Key排序和按Value排序

    map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行 ...

  8. C++ STL容器 —— map/multimap 用法详解

    C++ STL容器 -- map/multimap 用法详解 写在前面:近期正在学习C++的STL容器,因此在这里做一下日志记录,主要介绍一些容器基本成员函数的用法, 配上实际用例,并不涉及原理.但别 ...

  9. STL笔记(5)条款49:学习破解有关STL的编译器诊断信息

    STL笔记(5)条款49:学习破解有关STL的编译器诊断信息 条款49:学习破解有关STL的编译器诊断信息 用一个特定的大小定义一个vector是完全合法的, vector<int> v( ...

最新文章

  1. 第八章教材内容总结:异常控制流
  2. Wallop下蛋送邀请。
  3. 死磕Java并发:J.U.C之Condition
  4. Apriori算法简介及实现(python)
  5. coco关键点标注json_COCO 数据集中目标检测标注说明
  6. Plugin with id ‘com.android.XXX‘ not found.
  7. Django redis的使用
  8. 自己动手写CPU(5)简单算术操作指令实现_1
  9. centos7搜狐 mysql_基于centOS6.7搭建LAMP(httpd-2.4.18+mysql-5.5.47+php-5.6.16)环境
  10. CodeForces 1138B暴力+剪枝
  11. mysql 索引及索引创建原则
  12. htt【RiPro网盘链接检测插件】目前支持四种常用网盘
  13. jsp连接sqlServer数据库教程、jsp连接sqlServer数据库报ClassNotFoundException异常
  14. Linux搭建SVN 服务器(转)
  15. PaddlePaddle(8)—— 如何写好一篇高质量的精选项目
  16. 10. 二进制中1的个数(C++版本)
  17. iis服务器网站启动不了,IIS上打不开asp网站怎么办
  18. Mac OSX安装MongoDB
  19. x战娘2服务器维护,x战娘2变态版攻略
  20. 如何在计算机自动开机时选择用户,电脑如何设置自动开机

热门文章

  1. 卓越性能代码_「Win」被隐藏起来的卓越性能模式,为何不想让人发现?
  2. 重置linux内核,Linux Kernel 驱动非授权重置统计漏洞
  3. 特征级融合_更丰富的卷积特征用于目标边缘检测(文末附有论文及源码下载)...
  4. Python 基本数据类型 (一) - 整数
  5. WEB前端面试题 分别使用2个、3个、5个DIV画出一个大的红十字
  6. Android 手机卫士--9patch图
  7. java封装示例代码
  8. codeblocks c++ 编译出错
  9. (转)创业需要知道的13句话
  10. Generic Host Process for Win32 Service错误