例說資料結構&STL(十一)——hash_map/unordered_map
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<int,float>::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
相關文章
- 例說資料結構&STL(十三)——pair資料結構AI
- 例說資料結構&STL(一)——vector資料結構
- 例說資料結構&STL(二)——list資料結構
- 例說資料結構&STL(三)——deque資料結構
- 例說資料結構&STL(四)——queue資料結構
- 例說資料結構&STL(五)——stack資料結構
- 例說資料結構&STL(六)——heap資料結構
- 例說資料結構&STL(八)——set資料結構
- 例說資料結構&STL(九)——map資料結構
- 例說資料結構&STL(十二)——iterator資料結構
- 例說資料結構&STL(七)——priority_queue資料結構
- 例說資料結構&STL(十)——hash_set/unordered_set資料結構
- STL中經常使用資料結構資料結構
- 資料結構第十一節(雜湊表)資料結構
- 傳說中的資料結構_JAVA資料結構Java
- 資料結構:線性表-例題資料結構
- 【PG結構】Postgresql資料庫資料目錄說明SQL資料庫
- 從一條資料說起——InnoDB儲存資料結構資料結構
- 關於架構離不開資料結構之說架構資料結構
- 說說你對資料結構的理解?有哪些?區別?資料結構
- ECshop 每個資料庫表結構說明資料庫
- 資料結構與演算法(十一)——演算法-遞迴資料結構演算法遞迴
- 結構化資料、半結構化資料和非結構化資料
- 【資料結構篇】認識資料結構資料結構
- 【資料結構與演算法】通俗易懂說連結串列資料結構演算法
- 侯捷C++ STL體系結構與原始碼剖析:關於moveable的說明C++原始碼
- 2. STL容器結構與分類
- 資料結構小白系列之資料結構概述資料結構
- 資料結構?資料結構
- 資料結構資料結構
- 關於c++ STL map 和 unordered_map 的效率的對比測試C++
- Oracle例項和Oracle資料庫(Oracle體系結構)Oracle資料庫
- 資料結構與演算法-資料結構(棧)資料結構演算法
- 2 Day DBA-管理Oracle例項-管理資料庫儲存結構-關於資料庫儲存結構Oracle資料庫
- 資料結構 關於B樹說明及插入和分裂資料結構
- 【PHP資料結構】PHP資料結構及演算法總結PHP資料結構演算法
- 從零開始學Python:第十一課-常用資料結構之列表Python資料結構
- 資料結構-棧資料結構