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)文章
string,CString,char*之間的轉(zhuǎn)化
下面是MFC/C++/C中字符類型CString, int, string, char*之間的轉(zhuǎn)換的說明與舉例,經(jīng)常用的東西,相信對(duì)于用C/C++的朋友,還是比較有用的2013-03-03
Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼
這篇文章主要為大家詳細(xì)介紹了Qt如何利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的 功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
C++vector的insert函數(shù)用法小結(jié)
std::vector::insert是C++中用于在指定位置插入元素的函數(shù),支持插入單個(gè)元素、多個(gè)相同元素、一個(gè)范圍的元素或初始化列表中的元素,插入操作可能會(huì)使插入點(diǎn)之后的迭代器失效,并且時(shí)間復(fù)雜度為O(n),本文介紹C++vector的insert函數(shù)用法小結(jié),感興趣的朋友一起看看吧2025-03-03
QT連接SQLServer數(shù)據(jù)庫的實(shí)現(xiàn)
要使用Qt連接SQL Server數(shù)據(jù)庫,需要使用Qt提供的SQL模塊和SQL Server驅(qū)動(dòng)程序,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
C++ 數(shù)據(jù)結(jié)構(gòu)之對(duì)稱矩陣及稀疏矩陣的壓縮存儲(chǔ)
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之對(duì)稱矩陣及稀疏矩陣的壓縮存儲(chǔ)的相關(guān)資料,這里實(shí)現(xiàn)稀疏矩陣和對(duì)稱矩陣的壓縮存儲(chǔ)的實(shí)例,需要的朋友可以參考下2017-08-08

