欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?各種map特點(diǎn)對(duì)比分析

 更新時(shí)間:2025年03月22日 13:43:16   作者:越甲八千  
文章比較了C++中不同類型的map(如std::map,?std::unordered_map,?std::multimap,?std::unordered_multimap,?hash_map)的底層實(shí)現(xiàn)、元素順序、鍵的唯一性以及查找和插入刪除操作的效率,感興趣的朋友一起看看吧

特點(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_mapstd::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)文章

  • C語(yǔ)言超詳細(xì)i講解雙向鏈表

    C語(yǔ)言超詳細(xì)i講解雙向鏈表

    在實(shí)際生活中,我們用到的最多的兩種鏈表結(jié)構(gòu)就是單鏈表和雙向帶頭鏈表,上一篇已經(jīng)介紹了單鏈表的實(shí)現(xiàn)以及一些應(yīng)用,接下來(lái)我為大家詳細(xì)介紹一下雙向鏈表,以及一些鏈表oj題
    2022-05-05
  • C語(yǔ)言鍵盤控制走迷宮小游戲

    C語(yǔ)言鍵盤控制走迷宮小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鍵盤控制走迷宮小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Qt進(jìn)程和線程QProcess和QThread的使用

    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-06
  • c++ STL常用遍歷算法

    c++ STL常用遍歷算法

    這篇文章主要介紹了c++ STL常用遍歷算法的實(shí)現(xiàn),幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-12-12
  • C++中std::tuple和std::pair的高級(jí)用法

    C++中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-11
  • C++基本用法實(shí)踐之移動(dòng)語(yǔ)義詳解

    C++基本用法實(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-07
  • 神奇的c/c++小游戲((提高你的編程興趣)

    神奇的c/c++小游戲((提高你的編程興趣)

    本文通過c/c++編寫小游戲,可以提高新手們的編程興趣,接下來(lái)我們一起來(lái)看看吧
    2021-08-08
  • 教你Clion調(diào)試ROS包的方法

    教你Clion調(diào)試ROS包的方法

    Clion是一款專門開發(fā)C以及C++所設(shè)計(jì)的跨平臺(tái)的IDE,本文給大家介紹Clion調(diào)試ROS包的方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • C語(yǔ)言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹

    C語(yǔ)言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹

    大家好,本篇文章主要講的是C語(yǔ)言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++變量存儲(chǔ)的生命周期與作用域?qū)嵗a精講

    C++變量存儲(chǔ)的生命周期與作用域?qū)嵗a精講

    這篇文章主要介紹了C++變量存儲(chǔ)的生命周期與作用域,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下
    2022-10-10

最新評(píng)論