STL之Map和MFC之CMap比較學習

2021-06-21 09:47:26 字數 2610 閱讀 7555

在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...