C++?容器中map和unordered?map區(qū)別詳解
C++ 中 map 和 unordered_map區(qū)別
map 和 unordered_map 都可以看做是一種 key-value
的映射關(guān)系,unordered_map 可以理解為 無序版的map。unordered_map 是在 C++11 標(biāo)準(zhǔn)才出現(xiàn)的,所以你在代碼中如果使用了 unordered_map,則在編譯的時(shí)候要使用 c++11及以后的標(biāo)準(zhǔn) 進(jìn)行編譯。
這里直擊要點(diǎn):
- map 底層是 紅黑樹,(1) 增、刪、改、查都是十分平穩(wěn)的
log(n)
的復(fù)雜度,(2) 基于二叉查找樹,數(shù)據(jù)是有序排列的 (按 key 排序)。在存儲(chǔ)上 map 比較占用空間,因?yàn)樵诩t黑樹中,每一個(gè)節(jié)點(diǎn)都要額外保存父節(jié)點(diǎn)和子節(jié)點(diǎn)的連接,因此使得每一個(gè)節(jié)點(diǎn)都占用較大空間來維護(hù)紅黑樹的性質(zhì)。 - unordered_map 底層是 hash表, 其查找的復(fù)雜度是常數(shù)級(jí)別的
O(1)
,構(gòu)造的時(shí)候如果有沖突時(shí)間成本會(huì)增加,并且做不到數(shù)據(jù)有序排列。沖突的解決:當(dāng)沖突數(shù)小于8的時(shí)候用鏈?zhǔn)降刂贩ń鉀Q沖突,當(dāng)沖突大于8的時(shí)候使用紅黑樹解決沖突。
來把區(qū)別用表格展示:
map 和 unordered_map 在代碼使用上十分類似,來看看兩者的用法:
int main(){ //// map 用法 map<int, string> _ismap; // 增的三種方法 _ismap.insert(make_pair(0, "kobe")); _ismap[1] = "james"; _ismap.insert(map<int, string>::value_type(2, "curry")); // 遍歷 for (auto &iter : _ismap){ cout << iter.first << " : " << iter.second << endl; /* * 輸出如下 按key遞增排序 * 0 : kobe * 1 : james * 2 : curry */ } // 刪除 map<int, string> ::iterator _mapIter = _ismap.find(0); _ismap.erase(_mapIter); // 刪除指定的key // _ismap.erase(0); // 刪除key=0的鍵值對(duì) // _ismap.erase(std::begin(_ismap)); // 刪除第一個(gè)鍵值對(duì) //// unordered_map 用法 unordered_map<int, string> _isunorderedMap; // 增的三種方法 _isunorderedMap.insert(make_pair(0, "yaoming")); _isunorderedMap[1] = "yi"; _isunorderedMap.insert(unordered_map<int, string>::value_type(2, "zhouqi")); // 遍歷 for (auto iter = unorderedMap.begin(); iter != unorderedMap.end(); iter++){ cout << iter->first << " : " << iter->second << endl; /* * 輸出如下 亂序 * 2 : zhouqi * 0 : yaoming * 1 : yi */ // 刪除 auto _unorderedIter = _isunorderedMap.find(0); _isunorderedMap.erase(_unorderedIter); // 刪除指定的key // _unorderedIter.erase(0); // 刪除key=0的鍵值對(duì) // _unorderedIter(_unorderedIter.begin()); // 刪除第一個(gè)鍵值對(duì) } }
以上就是C++ 容器中map和unordered map區(qū)別詳解的詳細(xì)內(nèi)容,更多關(guān)于C++ map區(qū)別unordered map的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ deque與vector對(duì)比的優(yōu)缺點(diǎn)
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢(shì)與劣勢(shì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01OpenCV實(shí)現(xiàn)圖像轉(zhuǎn)換為漫畫效果
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像轉(zhuǎn)換為漫畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案
這篇文章主要介紹了Visual studio setup.exe 安裝vs2022報(bào)錯(cuò)的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01C++中的動(dòng)態(tài)規(guī)劃子序列問題分析探討
可能有些讀者有接觸過動(dòng)態(tài)規(guī)劃,可能也有一些讀者以前完全不知道動(dòng)態(tài)規(guī)劃這個(gè)東西,別擔(dān)心,我這篇文章會(huì)為讀者做一個(gè)入門,好讓讀者掌握這個(gè)重要的知識(shí)點(diǎn)2023-03-03C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(65.驗(yàn)證數(shù)字),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07