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

C++ unordered_map和unordered_set的使用示例詳解

 更新時間:2026年04月23日 14:15:50   作者:進(jìn)擊的荊棘  
本文主要介紹了unordered_set和unordered_multiset的使用,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧

1.unordered_set系列的使用

1.1unordered_set和unordered_multiset參考文檔

<unordered_set> - C++ Reference

1.2unoredered_set類的使用

●unordered_set的聲明如下,Key就是unordered_set底層關(guān)鍵字的類型

●unordered_set默認(rèn)要求Key支持轉(zhuǎn)換為整型,若不支持或想按自己的需求走可以自己實現(xiàn)支持將Key轉(zhuǎn)成整型的仿函數(shù)傳給第二個模板參數(shù)

●unordered_set默認(rèn)要求支持比較相等,若不支持或想按自己的需求走可以自己實現(xiàn)支持將Key比較相等的仿函數(shù)傳給第三個模板參數(shù)

●unordered_set底層存儲數(shù)據(jù)的內(nèi)存是從空間配置器申請的,若需要可以自己實現(xiàn)內(nèi)存池,傳給第四個參數(shù)

●一般情況下,不需要傳后三個模板參數(shù)

●unordered_set底層是用哈希桶實現(xiàn),增刪查改平均效率是O(1),迭代器遍歷不再有序,為了跟set區(qū)分,所以取名unoredered_set

●set和unordered_set的功能高度相似,只是底層不同,有一些性能和使用的差異。

template<class Key,        //unoredered_set::key_type/value_type
        class Hash=hash<Key>,    //unoredered_set::hasher
        class Pred=equal_to<Key>,    //unoredered_set::key_equal
        class Alloc=allocator<Key>    //unoredered_set::allocator_type
        > class unordered_set;

1.3unordered_set和set的使用差異

●unordered_set的支持增刪查改和set的使用一摸一樣。

●unordered_set和set的第一個差異是對key的要求不同,set要求Key支持小于比較,而unordered_set要求Key支持轉(zhuǎn)成整型且支持等于比較,本質(zhì)是哈希表的要求。

●unordered_set和set的第二個差異是迭代器的差異,set的iterator是雙向迭代器,unordered_set是單向迭代器,其次set底層是紅黑樹,紅黑樹是二叉搜索樹,走中序遍歷是有序的,所以set迭代器是有序+去重;而unordered_set底層是哈希表,迭代器遍歷是無序+去重。

●unordered_set和set第三個差異是性能的差異,整體而言大多數(shù)場景下,unordered_set的增刪查改更快一些,因為紅黑樹增刪查改效率是O(logN),而哈希表增刪查改平均效率是O(1)。

pair<iterator,bool> insert(const value_type& val);
size_type erase(const key_type& k);
iterator find(const key_type& k);
int test_set(){
    const size_t N=1000000;
    unordered_set<int> us;
    set<int> s;
    vector<int> v;
    v.reserve(N);
    srand(time(0));
    for(size_t i=0;i<N;i++){
        //v.push_back(rand());    //N比較大時,重復(fù)值比較多
        v.push_back(rand()+i);    //重復(fù)值相對少
        //v.push_back(i);    //沒有重復(fù),有序
    }
    size_t begin1=clock();
    for(auto e:v)
        s.insert(e);
    size_t endl=clock();
    cout<<"set insert:"<<endl-begin1<<endl;
    size_t begin2=clock();
    for(auto e:v)
        us.insert(e);
    size_t end2=clock();
    cout<<"unordered_set insert:"<<end2-begin2<<endl;
    int m1=0;
    size_t begin3=clock();
    for(auto e:v){
        auto ret=s.find(e);
        if(ret!=s.end()){
            ++m1;
        }
    }
    size_t end3=clock();
    cout<<"set find:"<<end3-begin3<<"->"<<m1<<endl;
    int m2=0;
    size_t begin4=clock();
    for(auto e:v){
        auto ret=us.find(e);
        if(ret!=us.end()){
            ++m1;
        }
    }
    size_t end4=clock();
    cout<<"unordered_set find:"<<end4-begin4<<"->"<<m2<<endl;
    cout<<"插入數(shù)據(jù)個數(shù):"<<s.size()<<endl;
    cout<<"插入數(shù)據(jù)個數(shù):"<<us.size()<<endl;
    size_t begin5()=clock();
    for(auto e:v)
        s.erase(e);
    size_t end5=clock();
    cout<<"set erase:"<<end5-begin5<<endl;
    size_t begin6()=clock();
    for(auto e:v)
        us.erase(e);
    size_t end6=clock();
    cout<<"unordered_set erase:"<<end6-begin6<<endl;
    return 0;
}
int main(){
    test_set();
    return 0;
}

1.4unordered_map和map的使用差異

●unordered_map的支持增刪查改跟map的使用一模一樣。

●unordered_map和map的第一個差異是對key的要求不同,map要求Key支持小于比較,而unordered_map要求Key支持轉(zhuǎn)成整型且支持等于比較,本質(zhì)是哈希表的要求。

●unordered_map和map的第二個差異是迭代器的差異,map的iterator是雙向迭代器,unordered_map是單向迭代器,其次map底層是紅黑樹,紅黑樹是二叉搜索樹,走中序遍歷是有序的,所以map迭代器遍歷是Key有序+去重。而unordered_map底層是哈希表,迭代器遍歷是Key無序+去重。

●unordered_map和map的第三個差異是性能的差異,整體而言大多數(shù)場景下,unordered_map的增刪查改更快一些,因為紅黑樹增刪查改效率是O(logN),而哈希表增刪查改平均效率是O(1)。

pair<iterator,bool> insert(const value_type& val);
size_type erase(const key_type& k);
iterator find(const key_type& k);
mapped_type& operator[](const key_type& k);

1.5unordered_multimap/unordered_multiset

●unordered_multimap/unordered_multiset跟multimap/multiset功能完全類似,支持Key冗余。

●unordered_multimap/unordered_multiset跟multimap/multiset的差異也是三個方面的差異,key的要求的差異,iterator及遍歷順序的差異,性能的差異。

到此這篇關(guān)于C++ unordered_map和unordered_set的使用示例詳解的文章就介紹到這了,更多相關(guān)C++ unordered_map和unordered_set使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡單分析C語言中指針數(shù)組與數(shù)組指針的區(qū)別

    簡單分析C語言中指針數(shù)組與數(shù)組指針的區(qū)別

    這篇文章主要介紹了C語言中指針數(shù)組與數(shù)組指針的區(qū)別,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • c++ 實現(xiàn)KMP算法

    c++ 實現(xiàn)KMP算法

    這篇文章主要介紹了c++ 實現(xiàn)KMP算法的示例,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-10-10
  • C++類中的運算符重載過程

    C++類中的運算符重載過程

    文章介紹了運算符重載在C++中的重要性以及實現(xiàn)方法,包括加法運算符重載、左移運算符重載、遞增運算符重載、+=運算符重載、關(guān)系運算符重載和賦值運算符重載
    2024-11-11
  • C/C++中指針的深入理解

    C/C++中指針的深入理解

    指針在 C\C++ 語言中是很重要的內(nèi)容,并且和指針有關(guān)的內(nèi)容一向令初學(xué)者頭大,這篇文章主要給大家介紹了關(guān)于C/C++中指針的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • C++基于LINUX的文件操作

    C++基于LINUX的文件操作

    這篇文章主要為大家介紹了C++基于LINUX的文件操作示例知識擴(kuò)充,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • opengl繪制五星紅旗

    opengl繪制五星紅旗

    這篇文章主要為大家詳細(xì)介紹了opengl繪制五星紅旗的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換

    使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了如何使用C++實現(xiàn)Excel文件與CSV之間的相互轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-06-06
  • C++的cout.tellp()和cout.seekp()語法介紹

    C++的cout.tellp()和cout.seekp()語法介紹

    無論是使用 cout 輸出普通數(shù)據(jù),用 cout.put() 輸出指定字符,還是用 cout.write() 輸出指定字符串,數(shù)據(jù)都會先放到輸出流緩沖區(qū),待緩沖區(qū)刷新,數(shù)據(jù)才會輸出到指定位置,本文給大家介紹一下C++的cout.tellp()和cout.seekp()語法,需要的朋友可以參考下
    2023-09-09
  • C++模擬實現(xiàn)string的詳細(xì)過程

    C++模擬實現(xiàn)string的詳細(xì)過程

    在?C++?編程中,字符串的處理是一項常見且重要的任務(wù),標(biāo)準(zhǔn)庫中的?string?類為我們提供了便捷、高效的字符串操作方法,模擬實現(xiàn)?string?類?的背景源于對?C++?底層原理的探索欲望,所以本文給大家介紹了C++模擬實現(xiàn)string的詳細(xì)過程,需要的朋友可以參考下
    2024-08-08
  • 利用C語言實現(xiàn)猜數(shù)字游戲

    利用C語言實現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02

最新評論

永清县| 呼图壁县| 鹤山市| 凤城市| 清涧县| 缙云县| 自贡市| 威信县| 宁陕县| 灌云县| 连江县| 深圳市| 元阳县| 马公市| 特克斯县| 滦平县| 澳门| 于田县| 奈曼旗| 句容市| 新龙县| 来宾市| 都江堰市| 沾益县| 蓬莱市| 南通市| 永定县| 宝丰县| 汝州市| 霍邱县| 庆安县| 台南市| 江安县| 泰宁县| 和顺县| 白沙| 景洪市| 濉溪县| 海淀区| 改则县| 山东省|