最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(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ù)鍵的元素會被忽略。
  • 查找效率:查找操作的時(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_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>  // 對于支持 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)文章

  • Linux頁面置換算法的C語言實(shí)現(xiàn)

    Linux頁面置換算法的C語言實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Linux頁面置換算法的C語言實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • OpenCV外接USB攝像頭的方法

    OpenCV外接USB攝像頭的方法

    這篇文章主要為大家詳細(xì)介紹了OpenCV外接USB攝像頭的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C++多線程與鎖機(jī)制使用解讀

    C++多線程與鎖機(jī)制使用解讀

    文章主要介紹了C++中的多線程編程知識,包括線程的創(chuàng)建、參數(shù)傳遞、線程休眠、互斥鎖、條件變量、原子操作、死鎖預(yù)防、線程局部存儲、讀寫鎖和自旋鎖等內(nèi)容,并給出了相應(yīng)的實(shí)現(xiàn)方法和使用場景
    2026-04-04
  • C語言 小游戲打磚塊實(shí)現(xiàn)流程詳解

    C語言 小游戲打磚塊實(shí)現(xiàn)流程詳解

    打磚塊游戲是一種動作電子游戲的名稱。玩家操作一根螢?zāi)簧纤降摹鞍糇印?,讓一顆不斷彈來彈去的“球”在撞擊作為過關(guān)目標(biāo)消去的“磚塊”的途中不會落到螢?zāi)坏紫?。球碰到磚塊、棒子與底下以外的三邊會反彈,落到底下會失去一顆球,把磚塊全部消去就可以破關(guān)
    2021-11-11
  • C語言對堆排序一個(gè)算法思路和實(shí)現(xià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í)例

    這篇文章主要介紹了C++ 實(shí)現(xiàn)多數(shù)的最大公約數(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Opencv2.4.9函數(shù)HoughLinesP分析

    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.拆分詞句之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(140.拆分詞句之二),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中四種取整方式,取余/取模運(yùn)算以及負(fù)數(shù)取模問題詳解

    C語言中四種取整方式,取余/取模運(yùn)算以及負(fù)數(shù)取模問題詳解

    這篇文章主要介紹了C語言中四種取整方式及負(fù)數(shù)取模問題,包括了算法的分析與改進(jìn),是很多程序設(shè)計(jì)競賽中常見的算法,需要的朋友可以參考下
    2021-09-09
  • C語言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲

    C語言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言結(jié)構(gòu)數(shù)組實(shí)現(xiàn)貪吃蛇小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評論

乌苏市| 吉木萨尔县| 宣汉县| 海门市| 甘孜县| 茂名市| 卢氏县| 铁力市| 卓尼县| 东海县| 区。| 阿勒泰市| 玉溪市| 建德市| 贵州省| 依安县| 招远市| 秦皇岛市| 北票市| 内乡县| 屯门区| 武功县| 周宁县| 巩留县| 永靖县| 榆中县| 来宾市| 临澧县| 樟树市| 东莞市| 宜兰市| 江西省| 禄丰县| 德惠市| 贡觉县| 大余县| 阳原县| 彰化市| 阿城市| 易门县| 偃师市|