例說資料結構&STL(十一)——hash_map/unordered_map

無鞋童鞋發表於2017-07-30

1 白話hash_map/unordered_map
  本篇博文,我們來了解另外兩個基於key-value的新結構hash_map和unorderd_map。兩者都屬於基於雜湊表(hash table)構建的資料結構,都是儲存的key-value的值,可以通過key快速索引到value。它們儲存時是根據key的hash值判斷元素是否相同,即unordered_map內部元素是無序的,而map中的元素是按照二叉搜尋樹儲存,進行中序遍歷會得到有序遍歷。所以如果需要內部元素自動排序,使用map,不需要排序使用unordered_map,另外當然還要考慮內基底的構建所帶來的收益(雜湊表和紅黑樹的比較)。
  由於和前面介紹的無序集合容器一樣,unordered_map在C++11的時候被引入標準庫了,而hash_set並沒有,所以建議還是使用unordered_map比較好。
2 unordered_map實戰
 2.1 標頭檔案

#include<unordered_map> // hash_map則是#iunclude<hash_map>

using namespace std;

 2.2 unordered_map物件宣告
  unordered_map和map的構造過載一樣有好幾種建構函式,但是都是涉及記憶體分配器,所以我們就按預設定義即可:

unordered_map<int,float> map_fir;

unordered_map<int,float> map_sed = {{1,2.00},{2,0.33}}; //初始化

 2.3 其他操作
  下面我們來看看其包含的公共介面有哪些,由於大部分和map相似,並且很多性質又與unordered_set相似,這塊我們一併介紹,不再分開闡述,感興趣的可以看看下面兩篇博文例說資料結構&STL(十)——hash_set/unordered_set例說資料結構&STL(九)——map

map_sed.insert(pair<int,float>(100 , 0.1234)); // 插入一個鍵值對方法一

map_sed.insert(map<int,float>::value_type(110, 100.86)); //插入一個鍵值對方法二

map_sed[120] = 10000;       // 插入一個鍵值對方法三

int i = map_sed.count(110); // 統計map中某一關鍵字出現的次數,實際上要麼是1要麼是0

if (map_sed.find(110) != map_sed.end()) // 查詢是否存在110關鍵字,如果沒有查詢到則會指向end()
    cout << "exsit!" << endl;

unordered_map<int, float>::iterator iter1 = map_sed.lower_bound(2); //返回map中>=2的索引(迭代器),切記不是小於2

unordered_map<int, float>::iterator iter2 = map_sed.upper_bound(2); //返回map中>2的索引 

unordered_map<int, float>::iterator iter; //對應迭代器物件
//正向間接訪問
for (iter = map_sed.begin(); iter != map_sed.end(); iter++)
    cout << iter->first << "=" << iter->second << endl;

map<intfloat>::reverse_iterator iter; //對應反向迭代器物件

//反向間接訪問
for(iter=map_fir.rbegin();iter!=map_fir.rend();iter++)
    cout << iter->first << "=" << iter->second << endl; //輸出關鍵字與鍵值

unordered_map<int, float>::iterator iter3;

iter3 = map_fir.find(1);
map_fir.erase(iter3);     // 迭代器刪除某一個鍵值對

int n = map_fir.erase(1); // 關鍵字刪除,如果刪除了會返回1,否則返回0

map_fir.erase(map_fir.begin(), map_fir.end()); // 成片刪除

map_fir.swap(map_sed); // 交換所有資料,需要確保map中元素型別相同

map_fir.clear();       // 清空map_fir

map_fir.size();        // 統計map_fir中元素個數

map_fir.empty();       // 判斷map中是否為空,如果是空則返回1       

3 小結
  上面介紹了unordered_map資料結構特點以及其與map的區別。由於map和set一樣是基於紅黑樹構建的資料結構,而unordered_map和unordered_set是基於雜湊表,所以其訪問等時間複雜度都為O(1),n為集合中元素的個數。一般情況下如果需要內部元素自動排序,使用map,不需要排序使用unordered_map。
  以上是個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!
  轉載請註明出處:http://blog.csdn.net/FX677588/article/details/76375350  
 

相關文章