C++?各種map特點(diǎn)對(duì)比分析
特點(diǎn)比較
1. std::map
- 底層實(shí)現(xiàn):基于紅黑樹(一種自平衡的二叉搜索樹)。
- 元素順序:元素按照鍵(key)的升序排列。
- 鍵的唯一性:每個(gè)鍵只能出現(xiàn)一次,插入重復(fù)鍵的元素會(huì)被忽略。
- 查找效率:查找操作的時(shí)間復(fù)雜度為 O ( l o g n ) O(log n) O(logn),其中 n n n 是容器中元素的數(shù)量。
- 插入和刪除效率:插入和刪除操作的時(shí)間復(fù)雜度也為 O ( l o g n ) O(log n) O(logn)。
2. std::unordered_map
- 底層實(shí)現(xiàn):基于哈希表。
- 元素順序:元素沒有特定的順序,存儲(chǔ)位置由鍵的哈希值決定。
- 鍵的唯一性:每個(gè)鍵只能出現(xiàn)一次,插入重復(fù)鍵的元素會(huì)覆蓋原有的元素。
- 查找效率:平均情況下,查找操作的時(shí)間復(fù)雜度為 O ( 1 ) O(1) O(1),但在最壞情況下可能達(dá)到 O ( n ) O(n) O(n)。
- 插入和刪除效率:平均情況下,插入和刪除操作的時(shí)間復(fù)雜度為 O ( 1 ) O(1) O(1)。
3. std::multimap
- 底層實(shí)現(xiàn):同樣基于紅黑樹。
- 元素順序:元素按照鍵的升序排列。
- 鍵的唯一性:允許鍵重復(fù),即可以有多個(gè)元素具有相同的鍵。
- 查找效率:查找操作的時(shí)間復(fù)雜度為 O ( l o g n ) O(log n) O(logn)。
- 插入和刪除效率:插入和刪除操作的時(shí)間復(fù)雜度為 O ( l o g n ) O(log n) O(logn)。
4. std::unordered_multimap
- 底層實(shí)現(xiàn):基于哈希表。
- 元素順序:元素沒有特定的順序,由鍵的哈希值決定存儲(chǔ)位置。
- 鍵的唯一性:允許鍵重復(fù)。
- 查找效率:平均情況下,查找操作的時(shí)間復(fù)雜度為 O ( 1 ) O(1) O(1),最壞情況下為 O ( n ) O(n) O(n)。
- 插入和刪除效率:平均情況下,插入和刪除操作的時(shí)間復(fù)雜度為 O ( 1 ) O(1) O(1)。
5. hash_map
(SGI STL 擴(kuò)展)
- 底層實(shí)現(xiàn):基于哈希表。
- 元素順序:元素沒有特定的順序,由鍵的哈希值決定存儲(chǔ)位置。
- 鍵的唯一性:每個(gè)鍵只能出現(xiàn)一次,插入重復(fù)鍵的元素會(huì)覆蓋原有的元素。
- 查找效率:平均情況下,查找操作的時(shí)間復(fù)雜度為 O ( 1 ) O(1) O(1),最壞情況下為 O ( n ) O(n) O(n)。
- 插入和刪除效率:平均情況下,插入和刪除操作的時(shí)間復(fù)雜度為 O ( 1 ) O(1) O(1)。
在早期的 C++ 標(biāo)準(zhǔn)(如 C++98、C++03)中有hash_map
,不過它并非標(biāo)準(zhǔn)庫(kù)的一部分,而是來(lái)自于 SGI STL 擴(kuò)展。在 C++11 及以后的標(biāo)準(zhǔn)中,hash_map
被std::unordered_map
替代,std::unordered_map
成為標(biāo)準(zhǔn)的哈希表實(shí)現(xiàn)。不過有些編譯器仍然支持hash_map
,下面為你加入hash_map
并進(jìn)行比較,同時(shí)給出相應(yīng)的 C++ 示例代碼。
C++ 示例代碼
#include <iostream> #include <map> #include <unordered_map> #include <ext/hash_map> // 對(duì)于支持 hash_map 的編譯器 // 演示 std::map 的使用 void testStdMap() { std::map<int, std::string> myMap; myMap[1] = "apple"; myMap[2] = "banana"; myMap[1] = "cherry"; // 鍵 1 重復(fù),會(huì)覆蓋原有的值 std::cout << "std::map:" << std::endl; for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } } // 演示 std::unordered_map 的使用 void testUnorderedMap() { std::unordered_map<int, std::string> myUnorderedMap; myUnorderedMap[1] = "apple"; myUnorderedMap[2] = "banana"; myUnorderedMap[1] = "cherry"; // 鍵 1 重復(fù),會(huì)覆蓋原有的值 std::cout << "\nstd::unordered_map:" << std::endl; for (const auto& pair : myUnorderedMap) { std::cout << pair.first << ": " << pair.second << std::endl; } } // 演示 std::multimap 的使用 void testMultiMap() { std::multimap<int, std::string> myMultiMap; myMultiMap.insert({1, "apple"}); myMultiMap.insert({2, "banana"}); myMultiMap.insert({1, "cherry"}); // 鍵 1 重復(fù),允許插入 std::cout << "\nstd::multimap:" << std::endl; for (const auto& pair : myMultiMap) { std::cout << pair.first << ": " << pair.second << std::endl; } } // 演示 std::unordered_multimap 的使用 void testUnorderedMultiMap() { std::unordered_multimap<int, std::string> myUnorderedMultiMap; myUnorderedMultiMap.insert({1, "apple"}); myUnorderedMultiMap.insert({2, "banana"}); myUnorderedMultiMap.insert({1, "cherry"}); // 鍵 1 重復(fù),允許插入 std::cout << "\nstd::unordered_multimap:" << std::endl; for (const auto& pair : myUnorderedMultiMap) { std::cout << pair.first << ": " << pair.second << std::endl; } } // 演示 hash_map 的使用 void testHashMap() { __gnu_cxx::hash_map<int, std::string> myHashMap; myHashMap[1] = "apple"; myHashMap[2] = "banana"; myHashMap[1] = "cherry"; // 鍵 1 重復(fù),會(huì)覆蓋原有的值 std::cout << "\nhash_map:" << std::endl; for (const auto& pair : myHashMap) { std::cout << pair.first << ": " << pair.second << std::endl; } } int main() { testStdMap(); testUnorderedMap(); testMultiMap(); testUnorderedMultiMap(); testHashMap(); return 0; }
代碼解釋
testStdMap
函數(shù)演示了std::map
的使用,插入重復(fù)鍵的元素會(huì)覆蓋原有的值,元素按照鍵的升序排列。testUnorderedMap
函數(shù)演示了std::unordered_map
的使用,插入重復(fù)鍵的元素也會(huì)覆蓋原有的值,元素沒有特定的順序。testMultiMap
函數(shù)演示了std::multimap
的使用,允許插入重復(fù)鍵的元素,元素按照鍵的升序排列。testUnorderedMultiMap
函數(shù)演示了std::unordered_multimap
的使用,允許插入重復(fù)鍵的元素,元素沒有特定的順序。testHashMap
函數(shù)演示了hash_map
的使用,插入重復(fù)鍵的元素會(huì)覆蓋原有的值,元素沒有特定的順序。
需要注意的是,hash_map
不是標(biāo)準(zhǔn) C++ 的一部分,如果你使用的編譯器不支持 ext/hash_map
頭文件,代碼可能無(wú)法編譯。建議優(yōu)先使用標(biāo)準(zhǔn)的 std::unordered_map
。
到此這篇關(guān)于C++ 各種map對(duì)比的文章就介紹到這了,更多相關(guān)C++ map對(duì)比內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt進(jìn)程和線程QProcess和QThread的使用
本文主要介紹了Qt進(jìn)程和線程QProcess和QThread的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06C++中std::tuple和std::pair的高級(jí)用法
本文主要介紹了C++標(biāo)準(zhǔn)庫(kù)中std::pair和std::tuple的使用,包括它們的基本概念、使用場(chǎng)景、區(qū)別以及高級(jí)用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11C++基本用法實(shí)踐之移動(dòng)語(yǔ)義詳解
移動(dòng)(move)語(yǔ)義是C++引入了一種新的內(nèi)存優(yōu)化,以避免不必要的拷貝,下面小編就來(lái)和大家簡(jiǎn)單聊聊C++中移動(dòng)語(yǔ)義的相關(guān)使用吧,希望對(duì)大家有所幫助2023-07-07C語(yǔ)言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹
大家好,本篇文章主要講的是C語(yǔ)言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01C++變量存儲(chǔ)的生命周期與作用域?qū)嵗a精講
這篇文章主要介紹了C++變量存儲(chǔ)的生命周期與作用域,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下2022-10-10