c STL容器中map和hash map

2021-10-04 10:04:55 字數 2526 閱讀 5426

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內部自建一...