在mfc中,有cmap相關的map類, 在 map中有map。
// 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型別全部概況。
mapmap
mapmap
mapmap
map由此,還是map簡練。
再看遍歷時,各個處理如下:
cmapm_threadmap; //定義一組執行緒map
則在threadinfo info;
dword key ;
position pos = threadmap.getstartposition();
while (pos != null)
}如果採用std中的map處理則
mapm_threadmap;
map::iteraotr pit;
for(pit = m_threadmap.begin(); pit != m_threadmap.end(); pit++){
簡單明瞭,勝過用mfc中繁蕪而又不清晰的過程。所以多用std做程式開發比用一些過時的要好得多。
何須浪費時間去知道幾個茴字的寫法呢。是不是。
以上內容**
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
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
#include
using namespace std;
mapstring2int
基本操作:
:賦值或插入,find:查詢,insert:插入,erase:刪除。
用insert函式插入資料,在資料的插入上涉及到集合的唯一性這個概念,即當map中有這個關鍵字時,insert操作插入失敗,但是用[ ]操作符,它可以覆蓋以前該關鍵字對應的值。
2 、使用map遇到的問題:
(1)msvcp60.dll錯誤:編譯、鏈結都沒錯,debug模式下執行時出錯,msvcp60.dll錯誤,網上查資料發現是使用string的原因,最後改為mapint642int,沒問題了。
(2)warning 4678太多:標準庫中的標誌符超長了,在所有#include之前加入#pragma warning( disable : 4786 )
遮蔽掉這類warning,但是發現不管用,也許是我的工程中檔案太多,包含關係太複雜。新建了乙個最簡單的工程試了一下可以。
STL之map和multimap總結
map c 預設建構函式 建立乙個空map multimap map c op 建立乙個空map multimap,並以op原則作為排序準則 map c c2 複製建構函式 建立乙個新的map multimap 作為c2的副本 所有元素都被複製 map c c2 複製建構函式 建立乙個新的map 作...
STL之map容器和multimap容器
所有元素都會根據元素的鍵值自動排序。map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。map和l...
STL之map容器和multimap容器
所有元素都會根據元素的鍵值自動排序。map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。map和l...