日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++ STL 之 unordered_set 使用(包括unordersd_map)

發(fā)布時(shí)間:2024/10/14 c/c++ 150 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ STL 之 unordered_set 使用(包括unordersd_map) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

哈希表的實(shí)現(xiàn)復(fù)雜了該容器上的雙向遍歷,似乎沒(méi)有一種合適的方法能夠做到高效快速。 因此,unorder版本的map和set只提供前向迭代器(非unorder版本提供雙向迭代器)。

首先要include這個(gè)unordered_set頭文件。
然后就是第六行我們定義了一個(gè)整型int的集合,叫myset。
后面幾行,我們演示了insert/find/erase的用法。
有兩點(diǎn)需要注意:
一是這個(gè)容器是個(gè)集合,所以重復(fù)插入相同的值是沒(méi)有效果的。大家可以看到我們這里第7行和第9行插入了2次3,實(shí)際上這個(gè)集合里也只有1個(gè)3,第10行輸出的結(jié)果是2。
二是find的返回值是一個(gè)迭代器(iterator),如果找到了會(huì)返回指向目標(biāo)元素的迭代器,沒(méi)找到會(huì)返回end()。

對(duì)于unordered_set,insert/find/erase的平均復(fù)雜度是O(1),但是最壞復(fù)雜度是O(N)的,這里N是指容器中元素?cái)?shù)量。

有兩種情況會(huì)出現(xiàn)O(N)復(fù)雜度。
1是你的哈希函數(shù)太爛了,導(dǎo)致很多不同元素的哈希值都相同,全是碰撞,這種情況復(fù)雜度會(huì)變成O(N)。但是這種情況一般不用擔(dān)心,因?yàn)閷?duì)于string以及int double之類的基本數(shù)據(jù)類型,都有默認(rèn)的哈希函數(shù),而且默認(rèn)的哈希函數(shù)足夠好,不會(huì)退化到O(N)。如果是你自定義的哈希函數(shù),那你要小心一點(diǎn),別寫(xiě)的太差了。
2是如果insert很多數(shù)據(jù),會(huì)觸發(fā)rehash。就是整個(gè)哈希表重建。這個(gè)過(guò)程有點(diǎn)類似向vector里不斷添加元素,vector會(huì)resize。比如你新建一個(gè)vector時(shí),它可能只申請(qǐng)了一塊最多保存10個(gè)元素的內(nèi)存,當(dāng)你插入第11個(gè)元素的時(shí)候,它會(huì)自動(dòng)重新申請(qǐng)一塊更大空間,比如能存下20個(gè)元素。哈希表也是類似,不過(guò)rehash不會(huì)頻繁發(fā)生,均攤復(fù)雜度還是O(1)的,也不用太擔(dān)心。

unordered_set是一個(gè)集合,有的時(shí)候我們需要一個(gè)字典,就是保存一系列key/value對(duì),并且可以按key來(lái)查詢。比如我們要保存很多同學(xué)的成績(jī),每位同學(xué)有一個(gè)學(xué)號(hào),也有一個(gè)分?jǐn)?shù),我們想按學(xué)號(hào)迅速查到成績(jī)。這時(shí)候我們就可以用unordered_map。

unordered_map同樣也提供了增刪查函數(shù):
unordered_map::insert
unordered_map::find
unordered_map::erase
這三個(gè)函數(shù)的平均時(shí)間復(fù)雜度也是O(1)的。我們可以看一個(gè)例子:

首先我們看第2行,要用unordered_map你要先include相應(yīng)的頭文件。
在7行我們定義了一個(gè)mymap,它的key是string類型,字符串;value是整形。
第8第9行展示的insert插入,因?yàn)槲覀冞@里要插入的是一個(gè)key/value pair(鍵值對(duì)),我們要用make_pair函數(shù)把一個(gè)字符串和一個(gè)整數(shù)打包成一個(gè)pair。
第10行是find查找,find返回的也是一個(gè)迭代器,iterator。這里我們懶得寫(xiě)很長(zhǎng)的迭代器類型,直接用的auto。auto是c++11標(biāo)準(zhǔn)里的關(guān)鍵字,它會(huì)自動(dòng)推斷變量的類型。如果你的編譯器不支持c++11,那你還是要老老實(shí)實(shí)寫(xiě)全:unordered_map<string, int>::iterator


迭代器指向的是一個(gè)pair,所以第11行我們可以用first和second去拿到對(duì)應(yīng)的key和value,這里first是”c++”這個(gè)字符串,second是100這個(gè)整數(shù)。
第13第14行展示了一下erase刪除。

值得一提的是,unordered_map重載了[]運(yùn)算符,我們可以把key放在中括號(hào)里,像操作數(shù)組一樣操作unordered_map:

上面這個(gè)程序的輸出結(jié)果是101。大家可以看一下第8~第10行。我們把”c++”這個(gè)key放在中括號(hào)里就能直接操作”c++”對(duì)應(yīng)的值。這種寫(xiě)法會(huì)讓程序更直觀。
---------------------?
作者:夏普通?
來(lái)源:CSDN?
原文:https://blog.csdn.net/qq_34243930/article/details/81456582?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!

————————————————————————————————————————————————————————

unordered_set與與unordered_map相似,這次主要介紹unordered_set

unordered_set它的實(shí)現(xiàn)基于hashtable,它的結(jié)構(gòu)圖仍然可以用下圖表示,這時(shí)的空白格不在是單個(gè)value,而是set中的key與value的數(shù)據(jù)包

有unordered_set就一定有unordered_multiset.跟set和multiset一樣,一個(gè)key可以重復(fù)一個(gè)不可以

unordered_set是一種無(wú)序集合,既然跟底層實(shí)現(xiàn)基于hashtable那么它一定擁有快速的查找和刪除,添加的優(yōu)點(diǎn).基于hashtable當(dāng)然就失去了基于rb_tree的自動(dòng)排序功能

unordered_set無(wú)序,所以在迭代器的使用上,set的效率會(huì)高于unordered_set

注:

一是這個(gè)容器是個(gè)集合,所以重復(fù)插入相同的值是沒(méi)有效果的。大家可以看到我們這里第7行和第9行插入了2次3,實(shí)際上這個(gè)集合里也只有1個(gè)3,第10行輸出的結(jié)果是2。
二是find的返回值是一個(gè)迭代器(iterator),如果找到了會(huì)返回指向目標(biāo)元素的迭代器,沒(méi)找到會(huì)返回end()。

對(duì)于unordered_set,insert/find/erase的平均復(fù)雜度是O(1),但是最壞復(fù)雜度是O(N)的,這里N是指容器中元素?cái)?shù)量。
?

  • template<class _Value,
  • class _Hash = hash<_Value>,
  • class _Pred = std::equal_to<_Value>,
  • class _Alloc = std::allocator<_Value> >
  • class unordered_set
  • : public __unordered_set<_Value, _Hash, _Pred, _Alloc>
  • {
  • typedef __unordered_set<_Value, _Hash, _Pred, _Alloc> _Base;
  • ...
  • }  
  • ?

    參數(shù)1 _Value key和value的數(shù)據(jù)包

    參數(shù)2 _Hash hashfunc獲取hashcode的函數(shù)

    參數(shù)3 _Pred 判斷key是否相等

    參數(shù)4 分配器

    下面介紹一下unordered_set的基本使用,最后我會(huì)分享一下我的測(cè)試代碼


    ?

    一 定義

  • //定義
  • unordered_set<int> c1;
  • //operator=
  • unordered_set<int> c2;
  • c2 = c1;
  • ?

    ?


    ?

    二 容量操作

  • //判斷是否為空
  • c1.empty();
  • //獲取元素個(gè)數(shù) size()
  • c1.size();
  • //獲取最大存儲(chǔ)量 max_size()
  • c1.max_size();
  • ?


    ?

    三 迭代器操作

  • //返回頭迭代器 begin()
  • unordered_set<int>::iterator ite_begin = c1.begin();
  • //返回尾迭代器 end()
  • unordered_set<int>::iterator ite_end = c1.end();
  • //返回const頭迭代器 cbegin()
  • unordered_set<int>::const_iterator const_ite_begin = c1.cbegin();
  • //返回const尾迭代器 cend()
  • unordered_set<int>::const_iterator const_ite_end = c1.cend();
  • //槽迭代器
  • unordered_set<int>::local_iterator local_iter_begin = c1.begin(1);
  • unordered_set<int>::local_iterator local_iter_end = c1.end(1);

  • ?

    四 基本操作

  • //查找函數(shù) find() 通過(guò)給定主鍵查找元素
  • unordered_set<int>::iterator find_iter = c1.find(1);
  • //value出現(xiàn)的次數(shù) count() 返回匹配給定主鍵的元素的個(gè)數(shù)
  • c1.count(1);
  • //返回元素在哪個(gè)區(qū)域equal_range() 返回值匹配給定搜索值的元素組成的范圍
  • pair<unordered_set<int>::iterator, unordered_set<int>::iterator> pair_equal_range = c1.equal_range(1);
  • //插入函數(shù) emplace()
  • c1.emplace(1);
  • //插入函數(shù) emplace_hint() 使用迭代器
  • c1.emplace_hint(ite_begin, 1);
  • //插入函數(shù) insert()
  • c1.insert(1);
  • //刪除 erase()
  • c1.erase(1);//1.迭代器 value 區(qū)域
  • //清空 clear()
  • c1.clear();
  • //交換 swap()
  • c1.swap(c2);

  • ?五 籃子操作

  • //籃子操作 籃子個(gè)數(shù) bucket_count() 返回槽(Bucket)數(shù)
  • c1.bucket_count();
  • //籃子最大數(shù)量 max_bucket_count() 返回最大槽數(shù)
  • c1.max_bucket_count();
  • //籃子個(gè)數(shù) bucket_size() 返回槽大小
  • c1.bucket_size(3);
  • //返回籃子 bucket() 返回元素所在槽的序號(hào)
  • c1.bucket(1);
  • // load_factor 返回載入因子,即一個(gè)元素槽(Bucket)的最大元素?cái)?shù)
  • c1.load_factor();
  • // max_load_factor 返回或設(shè)置最大載入因子
  • c1.max_load_factor();

  • ?

    六 內(nèi)存操作

  • // rehash 設(shè)置槽數(shù)
  • c1.rehash(1);
  • // reserve 請(qǐng)求改變?nèi)萜魅萘?/li>
  • c1.reserve(1000);

  • ?

    七 hash func

  • //hash_function() 返回與hash_func相同功能的函數(shù)指針
  • auto hash_func_test = c1.hash_function();
  • //key_eq() 返回比較key值得函數(shù)指針
  • auto key_eq_test = c1.key_eq();
  • unordered_set注意事項(xiàng)

    for(auto it=v.begin();it!=v.end();it++) //auto是c++11標(biāo)準(zhǔn)里的關(guān)鍵字,它會(huì)自動(dòng)推斷變量的類型。 //如果你的編譯器不支持c++11, //那你還是要老老實(shí)實(shí)寫(xiě)全:unordered_map<string, int>::iterator //v.begin()返回的是一個(gè)指針類型所以想要具體的值還需要在前面加上* set.find(key) //如果key不存在,那么返回set.end()

    unordered_map注意事項(xiàng)

    class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> map;for(int i=0;i<nums.size();i++){auto it=map.find(target-nums[i]);if(it!=map.end()) return {it->second,i};map[nums[i]]=i;//或者 map.insert(make_pair(nums[i],i));}return {};} };

    上面這一段代碼中注意以下幾點(diǎn)

    1.使用find(key)方法時(shí),參數(shù)是key,同樣的也是返回指針類型 2.key值保存在it->first中,value保存在it->second中 3.當(dāng)我們使用insert方法插入鍵值對(duì)的時(shí)候需要在使用鍵值對(duì)函數(shù)make_pair() 4.我們還可以直接使用map[key]=value的方法 與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的C++ STL 之 unordered_set 使用(包括unordersd_map)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。