map與unordered_map都是c++ stl中的關聯容器,二者的使用也都大體相同。不過在底層的實現上,map使用的是紅黑樹,unordered_map使用的則是hash表。c++
紅黑樹是一種相對平衡的二叉搜索樹,而且其附加定義以下:算法
能夠參考一下如下blog:
Red-Black Trees數組
相對於AVL平衡樹,紅黑樹對於平衡性的要求沒有那麼高,因爲其對於顏色的定義,任意節點左右子樹的高度差在一倍以內(最長路徑爲節點紅黑相間,最短路徑爲節點全黑),所以頻繁插入和刪除節點時,觸發平衡調整的次數更少,平衡調整的過程也更易收斂。數據結構
而c++ stl中的map使用紅黑樹做爲底層實現,對於map中的鍵值,它只要可以比較大小:如數值、字符串或其它可以支持大小比較的類就能夠。函數
hash表,其實就是經過必定的算法:hash函數將原始數據轉爲一段固定長度的數值(表這個詞其實沒有具體意義,hash的存儲方式有不少,如再鏈表法,如開放地址法的數據結構,表只是對於它們的一種籠統稱呼)。blog
具體可見:什麼是hash字符串
這裏主要回答一下我本身長期的一個誤區:get
即以前我一直覺得hash只適用於key-value這樣的數據,而且認爲hash表中只存儲value,那麼根據key的hash值尋找數據時,存在hash衝突的話,就無法知道當前hash值對應的value數據到底哪一個是對應於key的。hash
其實,hash也能夠對於不是key-value這樣的數據進行存儲,好比就是一系列大量的數值或字符串,咱們可使用hash算法,而不是簡單的數組順序存儲,爲的是加快查找速度;而且對於key-value這樣的數據,其實hash表中所存儲的不是隻有value,而是key-value這個鍵值對都存儲了,這樣在有hash衝突的狀況下就能根據key值找到真正對應的value。io