C++?各種map特點(diǎn)對比分析
特點(diǎn)比較
1. std::map
- 底層實(shí)現(xiàn):基于紅黑樹(一種自平衡的二叉搜索樹)。
- 元素順序:元素按照鍵(key)的升序排列。
- 鍵的唯一性:每個(gè)鍵只能出現(xiàn)一次,插入重復(fù)鍵的元素會被忽略。
- 查找效率:查找操作的時(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):基于哈希表。
- 元素順序:元素沒有特定的順序,存儲位置由鍵的哈希值決定。
- 鍵的唯一性:每個(gè)鍵只能出現(xiàn)一次,插入重復(fù)鍵的元素會覆蓋原有的元素。
- 查找效率:平均情況下,查找操作的時(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):基于哈希表。
- 元素順序:元素沒有特定的順序,由鍵的哈希值決定存儲位置。
- 鍵的唯一性:允許鍵重復(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):基于哈希表。
- 元素順序:元素沒有特定的順序,由鍵的哈希值決定存儲位置。
- 鍵的唯一性:每個(gè)鍵只能出現(xiàn)一次,插入重復(fù)鍵的元素會覆蓋原有的元素。
- 查找效率:平均情況下,查找操作的時(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> // 對于支持 hash_map 的編譯器
// 演示 std::map 的使用
void testStdMap() {
std::map<int, std::string> myMap;
myMap[1] = "apple";
myMap[2] = "banana";
myMap[1] = "cherry"; // 鍵 1 重復(fù),會覆蓋原有的值
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ù),會覆蓋原有的值
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ù),會覆蓋原有的值
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ù)鍵的元素會覆蓋原有的值,元素按照鍵的升序排列。testUnorderedMap函數(shù)演示了std::unordered_map的使用,插入重復(fù)鍵的元素也會覆蓋原有的值,元素沒有特定的順序。testMultiMap函數(shù)演示了std::multimap的使用,允許插入重復(fù)鍵的元素,元素按照鍵的升序排列。testUnorderedMultiMap函數(shù)演示了std::unordered_multimap的使用,允許插入重復(fù)鍵的元素,元素沒有特定的順序。testHashMap函數(shù)演示了hash_map的使用,插入重復(fù)鍵的元素會覆蓋原有的值,元素沒有特定的順序。
需要注意的是,hash_map 不是標(biāo)準(zhǔn) C++ 的一部分,如果你使用的編譯器不支持 ext/hash_map 頭文件,代碼可能無法編譯。建議優(yōu)先使用標(biāo)準(zhǔn)的 std::unordered_map。
到此這篇關(guān)于C++ 各種map對比的文章就介紹到這了,更多相關(guān)C++ map對比內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言對堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼
這篇文章主要介紹了C語言對堆排序一個(gè)算法思路和實(shí)現(xiàn)代碼,堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進(jìn),需要的朋友可以參考下2014-06-06
C++ 實(shí)現(xiàn)多數(shù)的最大公約數(shù)的實(shí)例
這篇文章主要介紹了C++ 實(shí)現(xiàn)多數(shù)的最大公約數(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
Opencv2.4.9函數(shù)HoughLinesP分析
這篇文章主要為大家詳細(xì)介紹了Opencv2.4.9函數(shù)HoughLinesP,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言中四種取整方式,取余/取模運(yùn)算以及負(fù)數(shù)取模問題詳解
這篇文章主要介紹了C語言中四種取整方式及負(fù)數(shù)取模問題,包括了算法的分析與改進(jìn),是很多程序設(shè)計(jì)競賽中常見的算法,需要的朋友可以參考下2021-09-09
C語言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲
這篇文章主要為大家詳細(xì)介紹了C語言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10

