一:map的前世今生
(1)從關聯容器與順序容器說起,關聯容器通過鍵(key)儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素(vector,queue,stack,list等)。
關聯容器(associative containers)支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是 map 和 set。 其中map 的元素以鍵-值(key-value)對的形式組織:鍵用作元素在 map 中的索引,而值則表示所儲存和讀取的資料。set 僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。
(2)關聯容器型別
標準庫提供了8個關聯容器,如下表。
有序容器:型別map和multimap定義在標頭檔案map中,set和multiset定義在標頭檔案set中;無序容器:則分別定義在unordered_map 和unordered_set中。
1-- 說明:map型別通常被稱為關聯陣列(associative array),關聯陣列和正常陣列以「正常」陣列類似,不同之處在於其下標不必是整數。我們通過乙個關鍵字而不是位置來查詢值。與之相對,set就是關鍵字的簡單集合,當只是想知道乙個值是否存在時,set是最有用的。
2-- 使用map
// 統計每個單詞輸入的個數
mapword_count; // string 到 size_t的空map
string word;
while(cin >> word)
++word_count[word]; // 提取word 的計數器並將其加 1
3--使用set
mapword_count; // string 到 size_t的空map
setexclude = ;
string word;
while(cin >> word)
// 只統計不在exclude中的單詞
if(exclude.find(word) == exclude.end() )
++word_count[word]; // 提取word 的計數器並將其加 1
4--
注意:關聯容器對其關鍵字型別有一些限制。預設情況下,標準庫使用關鍵字型別的< 運算子來比較兩個關鍵字。
pair 型別
在介紹關聯容器操作之前,我們需要了解名為pair的標準庫型別,它定義在標頭檔案utility中。乙個pair儲存兩個資料成員,first 和 second
(3)一般來說,如果希望有效地儲存不同值的集合,那麼使用 set 容器比較合適,而map容器則更適用於需要儲存(乃至修改)每個鍵所關聯的值的情況。在做某種文字處理時,可使用 set 儲存要忽略的單詞。而字典則是 map 的一種很好的應用:單詞本身是鍵,而它的解釋說明則是值。 set 和 map 型別的物件所包含的元素都具有不同的鍵,不允許為同乙個鍵新增第二個元素。如果乙個鍵必須對應多個例項,則需使用 multimap 或 multi set,這兩種型別允許多個元素擁有相同的鍵。
二:map簡介(官方簡介)
(1)map是一類關聯式容器,它是模板類。關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在陣列中的位置類獲取。它的特點是增加和刪除節點對迭代器的影響很小,除了操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,不可以修改鍵值,只能修改其對應的實值。
(2)map的功能
自動建立key - value的對應。key 和 value可以是任意你需要的型別,但是需要注意的是對於key的型別,唯一的約束就是必須支援《操作符。
根據key值快速查詢記錄,查詢的複雜度基本是log(n),如果有1000個記錄,最多查詢10次,1,000,000個記錄,最多查詢20次。
快速插入key - value 記錄;快速刪除記錄;根據key 修改value記錄;遍歷所有記錄。
(3)map的定義
使用map得包含map類所在的標頭檔案:#include //注意,stl標頭檔案沒有副檔名.h
map物件是模板類,需要關鍵字和儲存物件兩個模板引數,基本的定義模式如下:
std:mappersonnel;
這樣就定義了乙個以int為鍵,值為string的map物件personnel。
map中定義了以下三個型別:
map::key_type : 表示map容器中,索引的型別;
對迭代器進行解引用時,將獲得乙個引用,指向容器中乙個value_type型別的值,對於map容器,其value_type是pair型別。
為了使用方便,可以對模板類進行一下型別定義,
typedef mapudt_map_int_cstring;
udt_map_int_cstring enummap;
三:在map中新增元素
給map中新增元素主要有兩種方法:
(1)使用下標操作符獲取元素,然後給元素賦值
for example:
mapword_count; // 定義了乙個空的map物件word_count;
word_count["anna"] = 1;
程式說明:
1.在word_count中查詢鍵為anna的元素,沒有找到.
2.將乙個新的鍵-值對插入到word_count中,他的鍵是const string型別的物件,儲存anna。而他的值則採用直初始化,這就意味著在本例中指為0.
3.將這個新的鍵-值對插入到word_count中
4.讀取新插入的元素,並將她的值賦為1.
使用下標訪問map與使用下標訪問陣列或者vector的行為是截然不同的:使用下標訪問不存在的元素將導致在map容器中新增乙個新的元素,他的鍵即為該下標值。
(2)使用map::insert方法新增元素
map容器提供的insert操作:
1. map.insert(e) : e是乙個用在map中的value_type型別的值。如果鍵不存在,則插入乙個值為e.second的新元素;如果鍵在map中已經存在,那麼不進行任何操作。該函式返回乙個pair型別,該pair型別的first元素為當前插入e的map迭代器,pair的second型別是乙個bool型別,表示是否插入了該元素。
2. map.insert(beg, end) : beg和end是迭代器,返回void型別
3. map.insert(iter, e) : e是value_type型別的值,如果e.first不在map中,則建立新元素,並以迭代器iter為起點搜尋新元素儲存的位置,返回乙個迭代器,指向map中具有給定鍵的元素。
for example:
word_count.insert(map::value_type("anna", 1));
word_count.insert(make_pair("anna", 1));
返回值:如果該鍵已在容器中,則其關聯的值保持不變,返回的bool值為true。
(3)查詢並獲取map中的元素
使用下標獲取元素存在乙個很危險的***:如果該鍵不在map容器中,那麼下標操作會插入乙個具有該鍵的新元素。
因此引入map物件的查詢操作:
map.count(k) : 返回map中鍵k的出現次數(對於map而言,由於乙個key對應乙個value,因此返回只有0和1,因此可以用此函式判斷k是否在map中)
map.find(k) : 返回map中指向鍵k的迭代器,如果不存在鍵k,則返回超出末端迭代器。
for example:
int occurs = 0;
if( word_count.cout("foobar") )
occurs = word_count["foobar"];
int occurs = 0;
map::iterator it = word_count.find("foobar");
if( it != word_count.end() )
occurs = it ->second;
(4)從map中刪除元素
移除某個map中某個條目用erase()
該成員方法的定義如下:
iterator erase(iterator it); //通過乙個條目物件刪除
iterator erase(iterator first, iterator last); //刪除乙個範圍
size_type erase(const key& key); //通過關鍵字刪除
(5) map物件的迭代遍歷
與其他容器一樣,map同樣提供begin和end運算,以生成用於遍歷整個容器的迭代器。
VC 中CMap的簡介和簡單例項!
最近在mfc中用到字典,自己不會在網上查了資料。簡單總結一下 一,cmap是什麼?對映 map 又稱為字典 dictionary 是由關鍵字 key 及其對應的元素值 value 所組成的元素單 元 element 的表單式集合。cmap是乙個mfc的模板類,可以建立乙個從任意型別的變數到另外乙個任...
物件型別簡介
物件型別是使用者自定義的一種復合資料型別,它封裝了資料結構和用於操縱這些資料結構的過程和函式。在建立複雜應用程式時,通過使用物件型別可以降低應用開發難度,進而提高應用開發的效率和速度。1.物件型別元件 物件型別包括屬性和方法,其中,屬性 attribute 用於描述物件所具有的特徵,而方法 moth...
NAT型別簡介
1 完全透明nat full cone nat 從相同內部主機 in ipx 埠 in portx 傳送的資料對映為相同的ip outip x 和埠 out port x 傳送到外網。並且從另乙個伺服器 y 如果直連到對映的ip out ip x 和埠 out port x 上,資料將會被 到內部主...