map 和 hash map 的使用方法

2021-07-22 10:15:38 字數 2740 閱讀 4155

1。目錄

map簡介

map的功能

使用map

在map中插入元素

查詢並獲取map中的元素

從map中刪除元素

2。map簡介

map是一類關聯式容器。它的特點是增加和刪除節點對迭代器的影響很小,除了那個操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,可以修改實值,而不能修改key。

3。map的功能

自動建立key - value的對應。key 和 value可以是任意你需要的型別。

根據key值快速查詢記錄,查詢的複雜度基本是log(n),如果有1000個記錄,最多查詢10次,1,000,000個記錄,最多查詢20次。

快速插入key - value 記錄。

快速刪除記錄

根據key 修改value記錄。

遍歷所有記錄。

4。使用map

使用map得包含map類所在的標頭檔案

#include //注意,stl標頭檔案沒有副檔名.h

map物件是模板類,需要關鍵字和儲存物件兩個模板引數:

std:mappersonnel;

這樣就定義了乙個用int作為索引,並擁有相關聯的指向string的指標.

為了使用方便,可以對模板類進行一下型別定義,

typedef mapudt_map_int_cstring;

udt_map_int_cstring enummap;

5。在map中插入元素

改變map中的條目非常簡單,因為map類已經對操作符進行了過載

enummap[1] = "one";

enummap[2] = "two";

.....

這樣非常直觀,但存在乙個效能的問題。插入2時,先在enummap中查詢主鍵為2的項,沒發現,然後將乙個新的物件插入enummap,鍵是2,值是乙個空字串,插入完成後,將字串賦為"two";該方法會將每個值都賦為預設值,然後再賦為顯示的值,如果元素是類物件,則開銷比較大。我們可以用以下方法來避免開銷:

enummap.insert(map:: value_type(2, "two"))

6。查詢並獲取map中的元素

下標操作符給出了獲得乙個值的最簡單方法:

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分別代表關鍵字和儲存的資料

7。從map中刪除元素

移除某個map中某個條目用erase()

該成員方法的定義如下

iterator erase(iterator it); //通過乙個條目物件刪除

iterator erase(iterator first, iteratorlast); 

//刪除乙個範圍

size_type erase(const key& key); //通過關鍵字刪除

clear()就相當於enummap.erase(enummap.begin(), enummap.end());

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仿函式,更改裡面關於桶數量的定義,如果取值合適,也可以得到更優的效能。而且如果你的資料是自定義的型別,必須要重寫這個仿函式。可以模仿原來的寫法,所有的成員函式,成員變數乙個不能少!

**與 :

hash map和map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。4.1 hash map和map的區別在 4.2 什麼時候需要用hash map,什麼時候需要用map?總 體來說,hash map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別 而map的查詢速度是log n...

map和hash map的比較

hash map和map的區別在 建構函式。hash map需要hash函式,等於函式 map只需要比較函式 小於函式 儲存結構。hash map採用hash表儲存,map一般採用紅黑樹 rb tree 實現。因此其記憶體資料結構是不一樣的。什麼時候需要用hash map,什麼時候需要用map?ha...

hash map和map的區別

這裡列幾個常見問題,應該對你理解和使用hash map比較有幫助。4.1 hash map和map的區別在 4.2 什麼時候需要用hash map,什麼時候需要用map?總 體來說,hash map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別 而map的查詢速度是log n...