C++?容器中map和unordered?map區(qū)別詳解
更新時間:2022年11月17日 16:01:46 作者:極智視界
這篇文章主要為大家介紹了C++?容器中map和unordered?map區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

C++ 中 map 和 unordered_map區(qū)別
map 和 unordered_map 都可以看做是一種 key-value 的映射關系,unordered_map 可以理解為 無序版的map。unordered_map 是在 C++11 標準才出現的,所以你在代碼中如果使用了 unordered_map,則在編譯的時候要使用 c++11及以后的標準 進行編譯。
這里直擊要點:
- map 底層是 紅黑樹,(1) 增、刪、改、查都是十分平穩(wěn)的
log(n)的復雜度,(2) 基于二叉查找樹,數據是有序排列的 (按 key 排序)。在存儲上 map 比較占用空間,因為在紅黑樹中,每一個節(jié)點都要額外保存父節(jié)點和子節(jié)點的連接,因此使得每一個節(jié)點都占用較大空間來維護紅黑樹的性質。 - unordered_map 底層是 hash表, 其查找的復雜度是常數級別的
O(1),構造的時候如果有沖突時間成本會增加,并且做不到數據有序排列。沖突的解決:當沖突數小于8的時候用鏈式地址法解決沖突,當沖突大于8的時候使用紅黑樹解決沖突。
來把區(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的鍵值對
// _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()); // 刪除第一個鍵值對
}
}以上就是C++ 容器中map和unordered map區(qū)別詳解的詳細內容,更多關于C++ map區(qū)別unordered map的資料請關注腳本之家其它相關文章!

