c map和unordered map怎麼選擇

2021-10-05 15:54:34 字數 2165 閱讀 3042

有序與無序

大多數情況下,應優先考慮使用unordered_map,除非使用場合要求key是有序的。

mapunordered_map在使用介面上非常像,但是兩者的實現方式不同,決定了兩者的表現形式和效能是不一樣的。

map使用紅黑樹實現,特點是有序,查詢效率是o(log(n)),關於map更詳細的使用和資料結構的組織可以看這裡,下邊是乙個示意結構(僅顯示key值)。

8

/ \3 10

/ \ \

1 6 14

/ \ /

4 7 13

unordered_map使用hash map組織元素,因此key是無序的,查詢效率是o(1)。還是上邊的key值,簡單起見我們以h(key) = key mod 8為hash函式,則下邊是其組織結構的示意圖:

|-8

|-1|-10

|-3|-4

|-13

|-6-14

|-7

對於上邊的這個例子,我們發現unordered_map的查詢效率確實要比map快很多,比如我們查詢key=7的元素,在map中我們要比較四次,分別是8 3 6 7,才可以得到想找的位置。可以對於unordered_map,我們直接取8的餘,就得到了。

所以,這兩個效率的比較是o(1)與樹的高度的比較,當然這個效率不代表所有情況,例如對於14這個元素兩者分別進行了三次和兩次比較。

在更極端情況下,如果我們插入的元素的hash值都是一樣的,那麼,unordered_map的查詢效率反而要壞於map了,例如下邊的這種情況。

|-8-16-24-32-40-48-56||

||||

|

可以看出,對於map來說,無論元素新增的順序是怎樣的,在進入map之後都會進行排序,嚴格來說是有序的插入

unordered_map確是按照元素插入的順序進行輸出,即訪問的。那麼是否意味著只要有序的插入,就可以保證unordered_map有序的組織元素呢?答案是否定的,這種按照插入順序的順序進行的訪問和輸出,某種意義上只是一種巧合。嚴格說來,unordered_map的訪問順序是由採用的hash函式決定的。

#include

#include

#include

#include

#include

// used for pair

using std::map;

using std::unordered_map;

using std::string;

using std::pair;

intmain()

unordered_map<

int, string> map_us;

map_us.

insert

(pair<

int, string>(2

,"zhao"))

; map_us.

insert

(pair<

int, string>(1

,"qian"))

; map_us.

insert

(pair<

int, string>(3

,"sun"))

;printf

("unordered_map:\n");

for(

auto

& v : map_us)

return0;

}

以上**的輸出如下,

std:map:

1:qian

2:zhao

3:sun

unordered_map:

2:zhao

1:qian

3:sun

對比CMap和Map使用

在mfc中,有cmap相關的map類,在 map中有map。special string variants class cmapstringtoptr map from cstring to void class cmapstringtoob map from cstring to cobject ...

c map 對key和value排序

1.對key值排序 使用提供的less grater或自定義排序 include include include include include include std greater using namespace std 按key的長度公升序排列 struct cmpbykeylength in...

C map容器和pair的結合使用

一 map和pair簡介 可以簡單的理解為如下 map可以當做乙個容器 裝載具有一定格式的資料 pair可以理解為元素 放入到容器的的乙個個個體 發現pair並沒有單獨行動的典型用法,正常都是配合map來使用 即把pair這個元素插入到map這個容器裡面 二 示例講解 typedef std map...