国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】unordered_map和unordered_set的使用

這篇具有很好參考價(jià)值的文章主要介紹了【C++】unordered_map和unordered_set的使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

文章目錄

  • 前言
  • 一、unordered_map的使用及性能測(cè)試
  • 二、unordered_set的使用
    • 1.習(xí)題練習(xí)
  • 總結(jié)

前言

unordered 系列關(guān)聯(lián)式容器
C++98 中, STL 提供了底層為紅黑樹結(jié)構(gòu)的一系列關(guān)聯(lián)式容器,在查詢時(shí)效率可達(dá)到O(logN) ,即最差情況下需要比較紅黑樹的高度次,當(dāng)樹中的節(jié)點(diǎn)非常多時(shí),查詢效率也不理想。最好的查詢是,進(jìn)行很少的比較次數(shù)就能夠?qū)⒃卣业?,因此在C++11 中, STL 又提供了 4 個(gè)
unordered 系列的關(guān)聯(lián)式容器,這四個(gè)容器與紅黑樹結(jié)構(gòu)的關(guān)聯(lián)式容器使用方式基本類似,只是
其底層結(jié)構(gòu)不同.
1.unordered_map
【C++】unordered_map和unordered_set的使用

?下面我們對(duì)比一下unordered_map和map的區(qū)別:

【C++】unordered_map和unordered_set的使用

【C++】unordered_map和unordered_set的使用看到這里大家發(fā)現(xiàn)了吧,其實(shí)他們的功能一模一樣,只不過底層不一樣。注意:map和set使用的是雙向迭代器? ? ? ? ? unordered系列用的是單向迭代器

map / set? ?:的底層是紅黑樹

unordered_map / unordered_set :的底層是哈希表

為什么要設(shè)計(jì)他們倆呢?因?yàn)楣5牟檎倚史浅8撸?/p>

下面我們進(jìn)入使用環(huán)節(jié):


一、unordered_map的使用

#include <unordered_map>
#include <unordered_set>
#include <iostream>
using namespace std;

void unordered_map_test()
{
	unordered_map<string, int> ump;
	ump.insert(make_pair("left", 1));
	ump.insert(make_pair("right", 2));
	ump.insert(make_pair("string", 3));
	ump.insert(make_pair("list", 4));
	ump.insert(make_pair("list", 5));
	for (auto& e : ump)
	{
		cout << e.first << ":" << e.second << endl;
	}
	cout << endl;
	unordered_map<string, int>::iterator it = ump.begin();
	while (it != ump.end())
	{
		cout << it->first << ":" << it->second << endl;
		++it;
	}
}
int main()
{
	unordered_map_test();
}

?我們可以看到unordered的使用方法簡(jiǎn)直和map一模一樣,都是重復(fù)的數(shù)據(jù)不會(huì)被插入,當(dāng)然也有支持重復(fù)數(shù)據(jù)插入的unordered_multimap系列,那么主要區(qū)別在哪里呢?我們來看看:

【C++】unordered_map和unordered_set的使用

?可以看到最主要的區(qū)別是unordered系列是無序的,下面我們給出map和unordered系列的性能測(cè)試:

void unordered_map_test2()
{
	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());
		//v.push_back(rand()+i);
		//v.push_back(i);
	}

	size_t begin1 = clock();
	for (auto e : v)
	{
		s.insert(e);
	}
	size_t end1 = clock();
	cout << "set insert:" << end1 - begin1 << endl;

	size_t begin2 = clock();
	for (auto e : v)
	{
		us.insert(e);
	}
	size_t end2 = clock();
	cout << "unordered_set insert:" << end2 - begin2 << endl;


	size_t begin3 = clock();
	for (auto e : v)
	{
		s.find(e);
	}
	size_t end3 = clock();
	cout << "set find:" << end3 - begin3 << endl;

	size_t begin4 = clock();
	for (auto e : v)
	{
		us.find(e);
	}
	size_t end4 = clock();
	cout << "unordered_set find:" << end4 - begin4 << endl << endl;

	cout << s.size() << endl;
	cout << us.size() << endl << 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 << endl;
}

?【C++】unordered_map和unordered_set的使用

先從10000個(gè)隨機(jī)數(shù)為例:

【C++】unordered_map和unordered_set的使用?我們可以看到哈希系列的各項(xiàng)功能都比普通的快,下面我們來100000個(gè)隨機(jī)數(shù)對(duì)比一下:

【C++】unordered_map和unordered_set的使用

?可以看到還是unordered系列更快,再來1000000個(gè):

【C++】unordered_map和unordered_set的使用

?從以上的結(jié)果可以看出來為什么c++會(huì)新增哈希系列了,下面是另一臺(tái)機(jī)器測(cè)出的數(shù)據(jù):

【C++】unordered_map和unordered_set的使用

?總結(jié):綜合各種場(chǎng)景而言,unordered系列綜合性能是更好的,尤其是find更是一騎絕塵。

二、unordered_set的使用

同樣我們先看看set和哈希set有沒有功能的不同:

【C++】unordered_map和unordered_set的使用

【C++】unordered_map和unordered_set的使用

?還是我們之前說的,set是雙向迭代器哈希系列是單向迭代器,除了迭代器有區(qū)別其他功能幾乎都是一樣的,下面我們演示一下基礎(chǔ)功能如何使用:

void unordered_set_test()
{
	unordered_set<int> ust;
	ust.insert(1);
	ust.insert(7);
	ust.insert(4);
	ust.insert(9);
	ust.insert(3);
	for (auto& e : ust)
	{
		cout << e << " ";
	}
	cout << endl;
	unordered_set<int>::iterator it = ust.begin();
	while (it != ust.end())
	{
		cout << *it << " ";
		++it;
	}
}
int main()
{
	unordered_set_test();
}

【C++】unordered_map和unordered_set的使用

習(xí)題練習(xí):?

?同樣與set的區(qū)別是無序的,以上就是所有內(nèi)容哈希系列的使用,下面我們用哈希系列練習(xí)一道題:

兩個(gè)數(shù)的交集I:

力扣鏈接:力扣

【C++】unordered_map和unordered_set的使用

?交集只需要找出兩個(gè)數(shù)組相同的元素就可以了,而且題目告訴了我們每個(gè)元素都是唯一的所以不存在重復(fù)元素.

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
       unordered_set<int> us1(nums1.begin(),nums1.end());
       unordered_set<int> us2(nums2.begin(),nums2.end());
       vector<int> v;
       for (auto& e:us1)
       {
           if (us2.find(e)!=us2.end())
           {
                v.push_back(e);
           }
       }
       return v;
    }
};

首先我們將兩個(gè)數(shù)組的數(shù)分別放入哈希set中,然后我們遍歷第一個(gè)哈希set(也可以遍歷第二個(gè)都是一樣的),然后我們讓第二個(gè)哈希set查找第一個(gè)哈希set中的值,如果找到了就說明這個(gè)數(shù)是交集就放到數(shù)組中,然后最后返回?cái)?shù)組即可。


總結(jié)

哈希系列的容器與之前的容器用法幾乎都是一樣的,經(jīng)常使用STL容器更容易上手,下一篇我們講解哈希表的底層原理并且實(shí)現(xiàn),所以要想實(shí)現(xiàn)底層還是需要知道人家這個(gè)容器是如何使用的你才能實(shí)現(xiàn)出功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-459244.html

到了這里,關(guān)于【C++】unordered_map和unordered_set的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】unordered_map,unordered_set模擬實(shí)現(xiàn)

    【C++】unordered_map,unordered_set模擬實(shí)現(xiàn)

    喜歡的點(diǎn)贊,收藏,關(guān)注一下把! 上一篇文章我們把unordered_map和unordered_set底層哈希桶的知識(shí)也都說清楚了,今天就根據(jù)哈希桶模擬實(shí)現(xiàn)出unordered_map和unordered_set。 這里如果看過以前文章【C++】map和set的模擬實(shí)現(xiàn),應(yīng)該會(huì)覺得簡(jiǎn)單。 因?yàn)閡nordered_map和unordered_set底層都是哈希桶

    2024年01月21日
    瀏覽(27)
  • 【C++】unordered_set與unordered_map的封裝

    【C++】unordered_set與unordered_map的封裝

    ??個(gè)人主頁:平凡的小蘇 ??學(xué)習(xí)格言:命運(yùn)給你一個(gè)低的起點(diǎn),是想看你精彩的翻盤,而不是讓你自甘墮落,腳下的路雖然難走,但我還能走,比起向陽而生,我更想嘗試逆風(fēng)翻盤 。 ?? C++專欄 : C++內(nèi)功修煉基地 家人們更新不易,你們的??點(diǎn)贊??和?關(guān)注?真的對(duì)我真

    2024年02月08日
    瀏覽(23)
  • 【C++】哈希表封裝實(shí)現(xiàn) unordered_map 和 unordered_set

    【C++】哈希表封裝實(shí)現(xiàn) unordered_map 和 unordered_set

    在 C++98 中,STL 提供了底層為紅黑樹結(jié)構(gòu)的一系列關(guān)聯(lián)式容器,在查詢時(shí)效率可達(dá)到 O(logN),即最差情況下只需要比較紅黑樹的高度次;但是當(dāng)樹中的節(jié)點(diǎn)非常多時(shí),其查詢效率也不夠極致。 最好的查詢是,不進(jìn)行比較或只進(jìn)行常數(shù)次比較就能夠?qū)⒃卣业?,因此?C++11 中,

    2023年04月16日
    瀏覽(23)
  • 【C++】用哈希桶模擬實(shí)現(xiàn)unordered_set和unordered_map

    【C++】用哈希桶模擬實(shí)現(xiàn)unordered_set和unordered_map

    順序結(jié)構(gòu)中(數(shù)組)查找一個(gè)元素需要遍歷整個(gè)數(shù)組,時(shí)間復(fù)雜度為O(N);樹形結(jié)構(gòu)中(二叉搜索樹)查找一個(gè)元素,時(shí)間復(fù)雜度最多為樹的高度次logN。理想的搜索方法: 可以不經(jīng)過任何比較,一次直接從表中得到要搜索的元素。 構(gòu)造一種存儲(chǔ)結(jié)構(gòu), 通過某種函數(shù)使元素的

    2024年04月11日
    瀏覽(21)
  • C++利用開散列哈希表封裝unordered_set,unordered_map

    C++利用開散列哈希表封裝unordered_set,unordered_map

    1.之前我們已經(jīng)實(shí)現(xiàn)了開散列的哈希表,今天我們來用它封裝unordered_set,unordered_map 2.本文的封裝比利用紅黑樹封裝set和map更加復(fù)雜 建議大家先去看我的紅黑樹封裝set和map再來看本文 因?yàn)橛泻芏嗟胤礁t黑樹封裝set和map時(shí)是同樣的思路和方法,所以本文不會(huì)太去贅述一遍 因?yàn)閡n

    2024年03月24日
    瀏覽(20)
  • C++ 哈希+unordered_map+unordered_set+位圖+布隆過濾器(深度剖析)

    C++ 哈希+unordered_map+unordered_set+位圖+布隆過濾器(深度剖析)

    想象一下,你有一個(gè)巨大的圖書館,里面擺滿了成千上萬本書。如果你想要找到其中一本特定的書,你會(huì)怎么做?如果你按照書的編號(hào)來有序地排列它們,找到特定的書本可能會(huì)很容易。但是,如果書籍是隨機(jī)地?cái)[放,你可能需要逐本地查找,這個(gè)過程會(huì)非常耗時(shí)。 而哈希函

    2024年02月21日
    瀏覽(24)
  • 【C++】開散列哈希表封裝實(shí)現(xiàn)unordered_map和unordered_set

    【C++】開散列哈希表封裝實(shí)現(xiàn)unordered_map和unordered_set

    在未達(dá)成目的之前,一切具有誘惑力的事物都顯得那么不堪一擊 1. 在C++98中,STL提供了底層為紅黑樹結(jié)構(gòu)的一系列關(guān)聯(lián)式容器,在查詢時(shí)效率可達(dá)到 l o g 2 N log_2 N l o g 2 ? N ,即最差情況下需要比較紅黑樹的高度次,當(dāng)樹中的節(jié)點(diǎn)非常多時(shí),查詢效率也不理想。 最好的查詢是

    2023年04月09日
    瀏覽(22)
  • 【C++入門到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入門 ]

    【C++入門到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入門 ]

    歡迎各位大佬們的關(guān)顧,本文將介紹unordered系列容器以及其中的兩個(gè)重要成員: unordered_map 和 unordered_set 。unordered_map是一種無序的關(guān)聯(lián)容器,它使用哈希表來存儲(chǔ)鍵值對(duì),并提供高效的插入、查找和刪除操作。在本文中,我們將首先介紹unordered_map的基本概念和特點(diǎn),然后詳

    2024年02月08日
    瀏覽(19)
  • 【C++】如何用一個(gè)哈希表同時(shí)封裝出unordered_set與unordered_map

    【C++】如何用一個(gè)哈希表同時(shí)封裝出unordered_set與unordered_map

    ?? 樊梓慕: 個(gè)人主頁 ??? 個(gè)人專欄: 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《藍(lán)橋杯試題》 《LeetCode刷題筆記》 《實(shí)訓(xùn)項(xiàng)目》 《C++》 《Linux》 《算法》 ?? 每一個(gè)不曾起舞的日子,都是對(duì)生命的辜負(fù) 目錄 前言 1.哈希桶源碼 ?2.哈希表模板參數(shù)的控制 3.字符串作為鍵值如何映射哈希值

    2024年03月26日
    瀏覽(40)
  • 【C++】STL——用一個(gè)哈希表封裝出unordered_map和unordered_set

    【C++】STL——用一個(gè)哈希表封裝出unordered_map和unordered_set

    根據(jù)先前對(duì)unordered_map和unordered_set的學(xué)習(xí),我們得知其底層是借助哈希表來實(shí)現(xiàn)的,接下來我們會(huì)使用上篇博客實(shí)現(xiàn)的開散列哈希表來模擬實(shí)現(xiàn)unordered_map和unordered_set,哈希表源代碼鏈接: Hash/Hash/HashBucket.h · wei/cplusplus - 碼云 - 開源中國(guó) (gitee.com) 下面我們對(duì)哈希表進(jìn)行改造,

    2023年04月18日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包