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)庫的一部分,而是來自于 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 頭文件,代碼可能無法編譯。建議優(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à)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
C++中std::tuple和std::pair的高級(jí)用法
本文主要介紹了C++標(biāo)準(zhǔn)庫中std::pair和std::tuple的使用,包括它們的基本概念、使用場(chǎng)景、區(qū)別以及高級(jí)用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹
大家好,本篇文章主要講的是C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01
C++變量存儲(chǔ)的生命周期與作用域?qū)嵗a精講
這篇文章主要介紹了C++變量存儲(chǔ)的生命周期與作用域,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下2022-10-10

