STL系列:map和unordered_map
map和unordered_map的使用
unordered_map的用法和map是一樣的,提供了insert,size,count,find等操作,并且里面的元素也是以pair類型來存貯的。
其底層實現是完全不同的,上方已經解釋了,但是就外部使用來說卻是一致的。
C++ Map常見用法說明
map
包含在頭文件#include < map >中。
map是STL的一個關聯容器,它提供一對一(第一個為key,每個key只能在map中出現一次,第二個為value)的數據處理能力。map內部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),所以在map內部所有的數據都是有序的,且map的查詢、插入、刪除操作的時間復雜度都是O(logN)。在使用時,map的key需要定義operator<。
map中的元素是按照二叉搜索樹(又名二叉查找樹或者二叉排序樹,特點就是左子樹上所有節點的鍵值都小于根節點的鍵值,右子樹所有節點的鍵值都大于根節點的鍵值)存儲的,使用中序遍歷可將鍵值按照從小到大遍歷出來。
unordered_map
包含在頭文件unordered_map: #include < unordered_map >中。
unordered_map和map類似,都是存儲的key-value的值,可以通過key快速索引到value。不同的是unordered_map不會根據key的大小進行排序,存儲時是根據key的hash值判斷元素是否相同,即unordered_map內部元素是無序的。unordered_map的key需要定義hash_value函數并且重載operator==。
unordered_map的底層是一個防冗余的哈希表(采用除留余數法)。哈希表最大的優點,就是把數據的存儲和查找消耗的時間大大降低,時間復雜度為O(1);而代價僅僅是消耗比較多的內存。
基本原理是使用一個下標范圍比較大的數組來存儲元素。可以設計一個哈希函數(hash函數,也叫做散列函數),使得每個元素的key都與一個函數值(即數組下標,hash值)相對應,于是用這個數組單元來存儲這個元素;也可以簡單的理解為,按照key為每一個元素“分類”,然后將這個元素存儲在相應“類”所對應的地方,稱為桶。
但是,不能夠保證每個元素的key與函數值是一一對應的,因此極有可能出現對于不同的元素,卻計算出了相同的函數值,這樣就產生了“沖突”,換句話說,就是把不同的元素分在了相同的“類”之中。總的來說,“直接定址”與“解決沖突”是哈希表的兩大特點。一般可采用拉鏈法解決沖突。
無序容器的性能依賴于hash函數的質量和桶的數量和大小。
舉例說明map的有序性和unordered_map的無序性
#include <iostream> #include <unordered_map> #include <map> #include <string> using namespace std; int main() { //注意:VS2012及以下版本不支持{}賦值unordered_map<int, string> myMap={{ 5, "張大" },{ 6, "李五" }};//使用{}賦值myMap[2] = "李四"; //使用[ ]進行單個插入,若已存在鍵值2,則賦值修改,若無則插入。myMap.insert(pair<int, string>(3, "陳二"));//使用insert和pair插入//記住pair類型,可以通過使用make_pair來生成pair對象。//遍歷輸出+迭代器的使用auto iter = myMap.begin();//auto自動識別為迭代器類型unordered_map<int,string>::iteratorwhile (iter!= myMap.end()){ cout << iter->first << "," << iter->second << endl; ++iter; } //查找元素并輸出+迭代器的使用auto iterator = myMap.find(2);//find()返回一個指向2的迭代器if (iterator != myMap.end())cout << endl<< iterator->first << "," << iterator->second << endl; system("pause"); return 0; }此時用的是unordered_map,輸出的結果為:
若把unordered_map換成map,輸出的結果為:
優缺點以及適用處
map:
缺點: 空間占用率高,因為map內部實現了紅黑樹,雖然提高了運行效率,但是因為每一個節點都需要額外保存父節點、孩子節點和紅/黑性質,使得每一個節點都占用大量的空間
適用處:對于那些有順序要求的問題,用map會更高效一些
unordered_map:
總結:
1. 內存占有率的問題就轉化成紅黑樹 VS hash表 , 還是unorder_map占用的內存要高。
2. 但是unordered_map執行效率要比map高很多
3. 對于unordered_map或unordered_set容器,其遍歷順序與創建該容器時輸入的順序不一定相同,因為遍歷是按照哈希表從前往后依次遍歷的
set和unordered_set的使用方法類似于map和unordered_map,詳情請見:
【總結】unordered_map,unordered_set,map和set的用法和區別
總結
以上是生活随笔為你收集整理的STL系列:map和unordered_map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.Ping 的实现协议及原理
- 下一篇: STL系列:关联容器的操作