日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL之Map和MFC之CMap比较学习

發布時間:2025/3/12 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL之Map和MFC之CMap比较学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在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比较学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。