map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。
自動建立key - value的對應。key 和 value可以是任意你需要的型別。
根據key值快速查詢記錄,查詢的複雜度基本是log(n),如果有1000個記錄,最多查詢10次,1,000,000個記錄,最多查詢20次。
快速插入key - value 記錄。
快速刪除記錄
根據key 修改value記錄。
遍歷所有記錄。
使用map得包含map類所在的標頭檔案
#include //注意,stl標頭檔案沒有副檔名.h
map物件是模板類,需要關鍵字和儲存物件兩個模板引數:
std:mappersonnel;
這樣就定義了乙個用int作為索引,並擁有相關聯的指向string的指標.
為了使用方便,可以對模板類進行一下型別定義,
typedef mapudt_map_int_cstring;
udt_map_int_cstring enummap;
改變map中的條目非常簡單,因為map類已經對操作符進行了過載
enummap[1] = 「one」;
enummap[2] = 「two」;
…這樣非常直觀,但存在乙個效能的問題。插入2時,先在enummap中查詢主鍵為2的項,沒發現,然後將乙個新的物件插入enummap,鍵是2,值是乙個空字串,插入完成後,將字串賦為"two"; 該方法會將每個值都賦為預設值,然後再賦為顯示的值,如果元素是類物件,則開銷比較大。我們可以用以下方法來避免開銷:
enummap.insert(map:: value_type(2, 「two」))
下標操作符給出了獲得乙個值的最簡單方法:
cstring tmp = enummap[2];
但是,只有當map中有這個鍵的例項時才對,否則會自動插入乙個例項,值為初始化值。
我們可以使用find()和count()方法來發現乙個鍵是否存在。
查詢map中是否包含某個關鍵字條目用find()方法,傳入的引數是要查詢的key,在這裡需要提到的是begin()和end()兩個成員,分別代表map物件中第乙個條目和最後乙個條目,這兩個資料的型別是iterator.
int nfindkey =2;
//要查詢的key
//定義乙個條目變數(實際是指標)
udt_map_int_cstring::iterator it= enummap.
find
(nfindkey);if
(it == enummap.
end())
else
通過map物件的方法獲取的iterator資料型別是乙個std::pair物件,包括兩個資料 iterator->first 和 iterator->second 分別代表關鍵字和儲存的資料
移除某個map中某個條目用erase()
該成員方法的定義如下
iterator erase
(iterator it)
;//通過乙個條目物件刪除
iterator erase
(iterator first, iterator last)
;//刪除乙個範圍
size_type erase
(const key& key)
;//通過關鍵字刪除
clear()就相當於 enummap.erase(enummap.begin(), enummap.end());
stl hash_map簡介
hash_map的用法和map是一樣的,提供了 insert,size,count等操作,並且裡面的元素也是以pair型別來存貯的。雖然對外部提供的函式和資料型別是一致的,但是其底層實現是完全不同的,map底層的資料結構是rb_tree而,hansh_map卻是雜湊表來實現的。
void
main()
從上面的列子可以看到,使用起來是沒什麼困難的,很方便。但是我們什麼時候要用map,什麼時候用hash_map呢?
map與hash_map
總 體來說,hash_map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別;而map的查詢速度是log(n)級別。hash還有hash函式的耗時。當有100w條記錄的時候,map也只需要20次的比較,200w也只需要21次的比較!所以並不一定常數就比log(n) 小!
hash_map對空間的要求要比map高很多,所以是以空間換時間的方法,而且,hash_map如果hash函式和hash因子選擇不好的話,也許不會達到你要的效果,所以至於用map,還是hash_map,從3個方面來權衡: 查詢速度, 資料量, 記憶體使用,還有乙個就是你的經驗!沒有特別的標準
另外可以通過重寫 hash_compair仿函式,更改裡面關於桶數量的定義,如果取值合適,也可以得到更優的效能。而且如果你的資料是自定義的型別,必須要重寫這個仿函式。可以模仿原來的寫法,所有的成員函式,成員變數乙個不能少!
c STL容器之map容器
1.map中所有的元素都是pair 2.pair元素中第乙個元素為key,第二個元素為value 3.所有元素都會根據鍵值自動排序 4.map中不允許有重複的鍵,multimap中允許有重複的鍵 優點 可以根據key快速的找到value 一 建構函式 mapmp map const map mp 二...
C STL 中 map 容器的說明和使用技巧
map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料 處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹 一 種非嚴格意...
c stl中map容器的基本用法
std map是stl的乙個關聯容器,它提供一對一 其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值 的資料處理能 力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下std map內部資料的組織,std map內部自建一...