1. 程式人生 > >【C++11】unoedered_map和map(部分轉載)

【C++11】unoedered_map和map(部分轉載)

好的 hash 比較 綜合 per 百萬 一點 應該 .net

1.結論

新版的hash_map都是unordered_map了,這裏只說unordered_map和map.

運行效率:unordered_map最高,而map效率較低但提供了穩定效率和有序的序列。

占用內存:map內存占用略低,unordered_map內存占用略高,而且是線性成比例的。

什麽時候使用哪個? 需要無序容器,快速查找刪除,不擔心略高的內存時用unordered_map;有序容器穩定查找刪除效率,內存很在意時候用map。

2.原理

map的內部實現是二叉平衡樹(紅黑樹);hash_map內部是一個hash_table一般是由一個大vector,vector元素節點可掛接鏈表來解決沖突,來實現.

技術分享圖片

hash_map其插入過程是:
  1. 得到key
  2. 通過hash函數得到hash值
  3. 得到桶號(一般都為hash值對桶數求模)
  4. 存放key和value在桶內。
其取值過程是:
  1. 得到key
  2. 通過hash函數得到hash值
  3. 得到桶號(一般都為hash值對桶數求模)
  4. 比較桶的內部元素是否與key相等,若都不相等,則沒有找到。
  5. 取出相等的記錄的value。
hash_map中直接地址用hash函數生成,解決沖突,用比較函數解決。

3.性能特點

非頻繁的查詢用map比較穩定;頻繁的查詢用hash_map效率會高一些,c++11中的unordered_map查詢效率會更高一些,但是內存占用比hash_map稍微大點。unordered_map 就是 boost 裏面的 hash_map 實現。


其實,stl::map對應於與java中的TreeMap,而boost::unordered_map對應於java中的HashMap
python中的map就是hashmap實現的,所以查詢效率會比C++的map查詢快。(java,python官方版的虛擬機都是用C語言實現的,所以內部的思想和方法都是通用的。)

若考慮有序,查詢速度穩定,容器元素量少於1000,非頻繁查詢那麽考慮使用map。
若非常高頻查詢(100個元素以上,unordered_map都會比map快),內部元素可非有序,數據大超過1k甚至幾十萬上百萬時候就要考慮使用unordered_map(元素上千萬上億時4GB的內存就要擔心內存不足了,需要數據庫存儲過程挪動到磁盤中)。

hash_map相比unordered_map就是千萬級別以上內存占用少15MB,上億時候內存占用少300MB,百萬以下都是unordered_map占用內存少,
且unordered_map插入刪除相比hash_map都快一倍,查找效率相比hash_map差不多,或者只快了一點約1/50到1/100。
綜合非有序或者要求穩定用map,都應該使用unordered_map,set類型也是類似的。
unordered_map 查找效率快五倍,插入更快,節省一定內存。如果沒有必要排序的話,盡量使用 hash_map(unordered_map 就是 boost 裏面的 hash_map 實現)。

4.使用unordered_map

unordered_map需要重載hash_value函數,並重載operator ==運算符。
詳細參考見(感謝orzlzro寫的這麽好的文章): http://blog.csdn.net/orzlzro/article/details/7099231

【C++11】unoedered_map和map(部分轉載)