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比较学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全国计算机考试真考题库4,全国计算机等级
- 下一篇: c语言编程中%g是什么格式