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

C++ unordered_set、unordered_map的使用及說明

 更新時間:2026年01月31日 13:48:19   作者:sushang~  
本文介紹了C++語言中四種unordered系列關(guān)聯(lián)式容器:unordered_set、unordered_multiset、unordered_map和unordered_multimap,它們的底層數(shù)據(jù)結(jié)構(gòu)都是哈希表,可以實現(xiàn)常數(shù)時間復(fù)雜度的查找操作

一、unordered系列關(guān)聯(lián)式容器

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

二、unordered_set的介紹

1.unordered_set是不按特定順序存儲鍵值的關(guān)聯(lián)式容器,其允許通過鍵值快速的索引到對應(yīng)的元素。

2.在unordered_set中,元素的值同時也是唯一的標(biāo)識它的key。

3.在內(nèi)部,unordered_set中的元素沒有按照任何特定的順序排序,為了能在常數(shù)范圍內(nèi)找到指定的key,unordered_set將相同哈希值的鍵值放在相同的桶中。

4.unordered_set容器通過key訪問單個元素要比set快,但它通常在遍歷元素子集的范圍迭代方面效率較低。

5.它的迭代器至少是前向迭代器。

三、unordered_set的使用

3.1 unordered_set的定義方式

  • 方式一:構(gòu)造一個某類型的空容器。
unordered_set<int> s1;
  • 方式二:拷貝構(gòu)造某同類型容器的復(fù)制品
unordered_set<int> s2(s1);
  • 方式三:使用迭代器拷貝構(gòu)造某一段內(nèi)容。
string str("abcdef");
unordered_set<char> s3(str.begin(),str.end());

3.2 unordered_set接口的使用

unordered_set當(dāng)中常用的成員函數(shù)如下:

函數(shù)聲明功能介紹
insert()插入指定元素
erase()刪除指定元素
find()查找指定元素
size()獲取容器中元素的個數(shù)
empty()判斷容器是否為空
clear清空容器
swap()交換兩個容器中的數(shù)據(jù)
count獲取容器中指定元素值的元素個數(shù)

unordered_set當(dāng)中迭代器相關(guān)函數(shù)如下:

函數(shù)聲明功能介紹
begin()獲取容器中第一個元素的正向迭代器
end()獲取容器中最后一個元素下一個位置的正向迭代器

3.3 unordered_multiset

unordered_multiset 容器與unordered_set容器的底層數(shù)據(jù)結(jié)構(gòu)是一樣的,都是哈希表,其次,它們所提供的成員函數(shù)的接口都是基本一致的,這兩種容器的唯一區(qū)別就是,unordered_multiset容器允許鍵值冗余,即unordered_multiset容器當(dāng)中存儲的元素是可以重復(fù)的。

由于unordered_multiset容器允許鍵值冗余,因此該容器中成員函數(shù)find和count的意義與unordered_set容器中的也有所不同:

成員函數(shù)find功能介紹
unordered_set容器返回鍵值val的元素的迭代器
unordered_multiset容器返回底層哈希表中第一個找到的鍵值為val的元素的迭代器
成員函數(shù)count功能介紹
unordered_set容器鍵值為val的元素存在則返回1,不存在則返回0(find成員函數(shù)可替代)
unordered_multiset容器返回鍵值為val的元素個數(shù)(find成員函數(shù)不可替代)

四、unordered_map的介紹

  1. unordered_map是存儲<key, value>鍵值對的關(guān)聯(lián)式容器,其允許通過keys快速的索引到與其對應(yīng)的value。
  2. 在unordered_map中,鍵值通常用于惟一地標(biāo)識元素,而映射值是一個對象,其內(nèi)容與此鍵關(guān)聯(lián)。鍵和映射值的類型可能不同。
  3. 在內(nèi)部,unordered_map沒有對<kye, value>按照任何特定的順序排序, 為了能在常數(shù)范圍內(nèi)找到key所對應(yīng)的value,unordered_map將相同哈希值的鍵值對放在相同的桶中。
  4. unordered_map容器通過key訪問單個元素要比map快,但它通常在遍歷元素子集的范圍迭代方面效率較低。
  5. unordered_maps實現(xiàn)了直接訪問操作符(operator[]),它允許使用key作為參數(shù)直接訪問value。
  6. 它的迭代器至少是前向迭代器。

五、unordered_map的使用

5.1 unordered_map的定義方式

  • 方式一:指定key和value的類型構(gòu)造一個空容器
unordered_map<string, int> m1;
  • 方式二:拷貝構(gòu)造某同類型容器的復(fù)制品
unordered_map<string, int> m2(m1);
  • 方式三:使用迭代器拷貝構(gòu)造某一段內(nèi)容
unordered_map<string, int> m3(m2.begin(),m2.end());

5.2 unordered_map接口的使用

unordered_map當(dāng)中常用的成員函數(shù)如下:

函數(shù)聲明功能介紹
insert()插入鍵值對
erase()刪除指定key值得鍵值對
find()查找指定key值得鍵值對
size()獲取容器中元素的個數(shù)
empty()判斷容器是否為空
clear清空容器
swap()交換兩個容器中的數(shù)據(jù)
count獲取容器中指定key值的元素個數(shù)

除了上述的成員函數(shù)之外,unordered_map容器當(dāng)中還實現(xiàn)了[ ]運算符重載函數(shù),該重載函數(shù)的功能非常強大:

  • 若當(dāng)前容器中已有鍵值為key的鍵值對,則返回該鍵值對value的引用
  • 若當(dāng)前容器中沒有鍵值對key的鍵值對,則先插入鍵值對<key, value>,然后再返回該鍵值對中value的引用

unordered_map當(dāng)中迭代器相關(guān)函數(shù)如下:

成員函數(shù)功能介紹
begin獲取容器中第一個元素的正向迭代器
end獲取容器中最后一個元素下一個位置的正向迭代器

5.3 unordered_multimap

unordered_multimap容器與unordered_map容器的底層數(shù)據(jù)結(jié)構(gòu)是一樣的,都是哈希表,其次,它們所提供的成員函數(shù)的接口都是基本一致的,這兩種容器唯一的區(qū)別就是,unordered_multimao容器允許鍵值冗余,即unordered_multimap容器當(dāng)中存儲的鍵值對的key值是可以重復(fù)的。

由于unordered_multimap容器允許鍵值對的鍵值冗余,因此該容器中成員函數(shù)find和count的意義與unordered_map容器中的也有所不同:

成員函數(shù)find功能介紹
unordered_map容器返回鍵值為key的鍵值對的迭代器
unordered_multimap容器返回底層哈希表中第一個找到的鍵值為key的鍵值對的迭代器
成員函數(shù)count功能介紹
unordered_map容器鍵值為key的鍵值對存在則返回1,不存在則返回0(find成員函數(shù)可替代)
unordered_multimap容器返回鍵值為key的鍵值對個數(shù)(find成員函數(shù)不可替代)

其次,由于unordered_multimap容器允許鍵值對冗余,調(diào)用[ ]運算符重載函數(shù)時,應(yīng)該返回鍵值為key的哪一個鍵值對的value的引用存在歧義,因此在unordered_multimap容器當(dāng)中沒有實現(xiàn)[ ]運算符重載函數(shù)

六、完整代碼

6.1 test.cpp

#define _CRT_SECURE_NO_WARNINGS 1

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

void test_unordered_set1()
{
	unordered_set<int> s;
	s.insert(1);
	s.insert(3);
	s.insert(2);
	s.insert(7);
	s.insert(2);

	unordered_set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	for (auto e : s)
	{
		cout << e << " ";
	}
	cout << endl;
}

void test_unordered_map1()
{
	string arr[] = { "蘋果", "西瓜", "蘋果", "西瓜", "蘋果", "蘋果", "西瓜",
	"蘋果", "香蕉", "蘋果", "香蕉" };
	unordered_map<string, int> countMap;
	
	for (auto& e : arr)
	{
		countMap[e]++;
	}

	for (auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
}


int main()
{
	test_unordered_set1();
	test_unordered_map1();

	return 0;
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版)

    C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版)

    這篇文章主要介紹了C++控制臺強化如何實現(xiàn)一定界面效果(簡潔版),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C語言大作業(yè)之圖書管理系統(tǒng)的實現(xiàn)詳程

    C語言大作業(yè)之圖書管理系統(tǒng)的實現(xiàn)詳程

    隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計算機應(yīng)用的普及,利用計算機對圖書館的日常工作進行管理勢在必行,趁著寒假時間手把手帶你用C語言實現(xiàn)一個圖書管理系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • C++調(diào)用matlab函數(shù)的實例

    C++調(diào)用matlab函數(shù)的實例

    這篇文章主要介紹了C++調(diào)用matlab函數(shù)的方法,包括封裝matlab函數(shù),編譯matlab函數(shù)及C++環(huán)境配置,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • C++實現(xiàn)紅黑樹應(yīng)用實例代碼

    C++實現(xiàn)紅黑樹應(yīng)用實例代碼

    紅黑樹它一種特殊的二叉查找樹,這意味著它滿足二叉查找樹的特征,但是也有許多自己的特性,這篇文章主要給大家介紹了關(guān)于C++實現(xiàn)紅黑樹的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • C語言怎么獲得進程的PE文件信息

    C語言怎么獲得進程的PE文件信息

    這篇文章主要介紹了C語言怎么獲得進程的PE文件信息的相關(guān)代碼,需要的朋友可以參考下
    2016-01-01
  • C++中的string類(C++字符串)入門完全攻略

    C++中的string類(C++字符串)入門完全攻略

    這篇文章主要給大家介紹了關(guān)于C++中string類(C++字符串)入門的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • C++實現(xiàn)LeetCode(241.添加括號的不同方式)

    C++實現(xiàn)LeetCode(241.添加括號的不同方式)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(241.添加括號的不同方式),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • vs2019+win10配置boost庫的詳細(xì)教程

    vs2019+win10配置boost庫的詳細(xì)教程

    這篇文章主要介紹了vs2019+win10配置boost庫,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • C++中可以接受任意多個參數(shù)的函數(shù)定義方法(詳解)

    C++中可以接受任意多個參數(shù)的函數(shù)定義方法(詳解)

    下面小編就為大家?guī)硪黄狢++中可以接受任意多個參數(shù)的函數(shù)定義方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • c++拷貝構(gòu)造函數(shù)防篡改示例

    c++拷貝構(gòu)造函數(shù)防篡改示例

    這篇文章主要介紹了拷貝構(gòu)造函數(shù)防篡改示例,需要的朋友可以參考下
    2014-04-04

最新評論

三门县| 中方县| 蚌埠市| 北流市| 田林县| 天峨县| 江安县| 白玉县| 普宁市| 合江县| 波密县| 博野县| 科技| 海城市| 平谷区| 西安市| 津市市| 鹤岗市| 石林| 九寨沟县| 依安县| 伊宁市| 寿光市| 邢台县| 绥德县| 安义县| 新晃| 石门县| 长阳| 安丘市| 六枝特区| 石首市| 固原市| 济阳县| 富民县| 绍兴县| 威远县| 和顺县| 台州市| 新乡市| 庄浪县|