網站首頁 編程語言 正文
C++ 中 map 和 unordered_map區別
map 和 unordered_map 都可以看做是一種 key-value
的映射關系,unordered_map 可以理解為 無序版的map。unordered_map 是在 C++11 標準才出現的,所以你在代碼中如果使用了 unordered_map,則在編譯的時候要使用 c++11及以后的標準 進行編譯。
這里直擊要點:
-
map 底層是 紅黑樹,(1) 增、刪、改、查都是十分平穩的
log(n)
的復雜度,(2) 基于二叉查找樹,數據是有序排列的 (按 key 排序)。在存儲上 map 比較占用空間,因為在紅黑樹中,每一個節點都要額外保存父節點和子節點的連接,因此使得每一個節點都占用較大空間來維護紅黑樹的性質。 -
unordered_map 底層是 hash表, 其查找的復雜度是常數級別的
O(1)
,構造的時候如果有沖突時間成本會增加,并且做不到數據有序排列。沖突的解決:當沖突數小于8的時候用鏈式地址法解決沖突,當沖突大于8的時候使用紅黑樹解決沖突。
? ?來把區別用表格展示:
?? 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的鍵值對 // _ismap.erase(std::begin(_ismap)); // 刪除第一個鍵值對 //// 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的鍵值對 // _unorderedIter(_unorderedIter.begin()); // 刪除第一個鍵值對 } }
原文鏈接:https://juejin.cn/post/7166520682384195614
相關推薦
- 2023-04-16 C#使用IronPython調用Python的實現_C#教程
- 2022-12-04 python亂序字符串排序的實現方式_python
- 2023-11-16 RuntimeError: Expected object of device type cuda
- 2022-07-21 常見CSS樣式
- 2022-06-04 R語言批量讀取某路徑下文件內容的方法_R語言
- 2022-05-26 python中的getter與setter你了解嗎_python
- 2022-09-25 CSS-元素隱藏的兩種主要方式
- 2022-04-01 關于python中if __name=‘__main__‘的理解
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支