有序與無序
大多數情況下,應優先考慮使用unordered_map
,除非使用場合要求key是有序的。
map
和unordered_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...