【STL】unordered_set

C C C++ 11 11 11 中, S T L STL STL 標準庫引入了一個新的標準關聯式容器 u n o r d e r e d _ s e t unordered\_set unordered_set無序集合)。功能和 s e t set set 類似,都用于存儲唯一元素。但是其底層數據結構是哈希表,因此集合中的元素都是無序存儲的,所以增刪查的時間復雜度為 O ( 1 ) O(1) O(1),增刪查的效率比 s e t set set 高。

文章目錄

  • 一、unordered_set 的介紹
  • 二、unordered_set 的使用(常用接口)
    • 1. 常見構造
    • 2. iterator 的使用
    • 3. 增刪查
    • 4. unordered_multiset
  • 三、unordered_set 的模擬實現
    • 1. STL 中的 hash_set 源碼
    • 2. unordered_set 的迭代器
    • 3. 模擬實現 unordered_set
  • 總結


一、unordered_set 的介紹

前面部分我們已經詳細介紹了 s e t set set 容器,可以參考我的這篇博客:【STL】 s e t set set。由于 s e t set set u n o r d e r e d _ s e t unordered\_set unordered_set 這兩個容器只是底層實現結構不同,其功能高度相似,基本上只要掌握 s e t set set 的用法, u n o r d e r e d _ s e t unordered\_set unordered_set 也就會用了。因此,和 s e t set set 相比只有一些性能和使用的差異,這里只介紹其差異部分。

在這里插入圖片描述

u n o r d e r e d _ s e t unordered\_set unordered_set 的聲明如下:

template < class Key, 						// unordered_set::key_type/value_typeclass Hash = hash<Key>, 			// unordered_set::hasherclass Pred = equal_to<Key>, 		// unordered_set::key_equalclass Alloc = allocator<Key> 	// unordered_set::allocator_type> class unordered_set;
  1. K e y Key Key 就是 u n o r d e r e d _ s e t unordered\_set unordered_set 底層關鍵字的類型。

  2. u n o r d e r e d _ s e t unordered\_set unordered_set 默認要求 K e y Key Key 支持轉換為整形,如果不支持或者有自己的需求可以自行實現支持將 K e y Key Key 轉成整形的仿函數傳給第二個模板參數。

  3. u n o r d e r e d _ s e t unordered\_set unordered_set 默認要求 K e y Key Key 支持比較相等,如果不支持或者有自己的需求可以自行實現支持將 K e y Key Key 比較相等的仿函數傳給第三個模板參數。

  4. u n o r d e r e d _ s e t unordered\_set unordered_set 底層存儲數據的內存是從空間配置器申請的,如果需要可以自己實現內存池,傳給第四個參數。

注意:一般情況下,我們都不需要傳后三個模板參數。

u n o r d e r e d _ s e t unordered\_set unordered_set 底層是用哈希桶實現,增刪查平均效率是 O ( 1 ) O(1) O(1),迭代器遍歷不再有序,為了跟 s e t set set 區分,所以取名 u n o r d e r e d _ s e t unordered\_set unordered_set無序集合)。


二、unordered_set 的使用(常用接口)

u n o r d e r e d _ s e t unordered\_set unordered_set 的底層結構是哈希表,因此不支持比較排序,所以細節上根據這一點和 s e t set set 有略微不同,其他都完全類似。這里只給出常用接口,更多詳細信息可以自行查官方文檔: u n o r d e r e d _ s e t unordered\_set unordered_set

1. 常見構造

構造 ( c o n s t r u c t o r ) (constructor) (constructor) 函數聲明接口說明
u n o r d e r e d _ s e t ( ) unordered\_set() unordered_set()無參默認構造
u n o r d e r e d _ s e t ( c o n s t u n o r d e r e d _ s e t & u s t ) unordered\_set(const\ unordered\_set\&\ ust) unordered_set(const?unordered_set&?ust)拷貝構造
u n o r d e r e d _ s e t ( I n p u t I t e r a t o r f i r s t , I n p u t I t e r a t o r l a s t ) unordered\_set(InputIterator\ first, InputIterator\ last) unordered_set(InputIterator?first,InputIterator?last)使用迭代器區間構造
u n o r d e r e d _ s e t ( i n i t i a l i z e r _ l i s t < v a l u e _ t y p e > i l ) unordered\_set (initializer\_list<value\_type> il) unordered_set(initializer_list<value_type>il)使用 i n i t i a l i z e r initializer initializer 列表構造

2. iterator 的使用

i t e r a t o r iterator iterator 的使用接口說明
b e g i n ( ) begin() begin() + + + e n d ( ) end() end() i t e r a t o r iterator iterator
c b e g i n ( ) cbegin() cbegin() + + + c e n d ( ) cend() cend() c o n s t _ i t e r a t o r const\_iterator const_iterator

u n o r d e r e d _ s e t unordered\_set unordered_set 的迭代器是一個單向迭代器iterator -> a forward iterator to const value_type

在這里插入圖片描述

3. 增刪查

u n o r d e r e d _ s e t unordered\_set unordered_set 增刪查接口說明
i n s e r t insert insert插入 v a l val val 數據
e r a s e erase erase刪除 v a l val val 數據
f i n d find find查找 v a l val val,返回 v a l val val 位置的迭代器(沒找到返回 e n d ( ) end() end()
c o u n t count count查找 v a l val val,返回 v a l val val 的個數

由于 u n o r d e r e d _ s e t unordered\_set unordered_set 不支持比較大小,且容器內元素是無序的,因此就沒有 l o w e r _ b o u n d lower\_bound lower_bound u p p e r _ b o u n d upper\_bound upper_bound 接口了。

4. unordered_multiset

u n o r d e r e d _ m u l t i s e t unordered\_multiset unordered_multiset m u l t i s e t multiset multiset 的使用基本完全類似,都支持關鍵值( K e y Key Key)冗余

m u l t i s e t multiset multiset 完全類似, i n s e r t / f i n d / c o u n t / e r a s e insert/find/count/erase insert/find/count/erase 都圍繞著支持值冗余有所差異:

  1. i n s e r t insert insert 可以插入相同的值

  2. 如果要查找的 x x x 有多個值, f i n d find find 會返回第一個迭代器

  3. c o u n t count count 會返回 x x x 的實際個數。

  4. e r a s e erase erase 指定值刪除時,會刪除所有的 x x x


三、unordered_set 的模擬實現

1. STL 中的 hash_set 源碼

S G I ? S T L 30 SGI-STL\ 30 SGI?STL?30 版本是 C C C++ 11 11 11 之前的 S T L STL STL 版本,源代碼中沒有 u n o r d e r e d _ s e t unordered\_set unordered_set,因為這個容器是 C C C++ 11 11 11 之后才更新的。但是 S G I ? S T L 30 SGI-STL\ 30 SGI?STL?30 實現了哈希表,容器的名字是 h a s h _ s e t hash\_set hash_set,它是作為非標準容器(非 C C C++ 標準規定必須實現的容器)出現的。

  1. h a s h _ s e t hash\_set hash_set

  1. h a s h t a b l e . h hashtable.h hashtable.h

2. unordered_set 的迭代器


3. 模擬實現 unordered_set

  1. h a s h t a b l e . h hashtable.h hashtable.h

  1. u n o r d e r e d _ s e t . h unordered\_set.h unordered_set.h

  1. t e s t . c p p test.cpp test.cpp


總結

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77991.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go語言八股文

1.go語言的接口是怎么實現 接口&#xff08;interface&#xff09;是一種類型&#xff0c;它定義了一組方法的集合。任何類型只要實現了接口中定義的所有方法&#xff0c;就被認為實現了該接口。 代碼的實現 package mainimport "fmt"// 定義接口 type Shape inte…

kafka auto.offset.reset詳解

在 Kafka 中&#xff0c;auto.offset.reset latest 的含義及行為如下&#xff1a; 1. ??核心定義?? 當消費者組??首次啟動??或??無法找到有效的 offset??&#xff08;例如 offset 過期、被刪除或從未提交&#xff09;時&#xff0c;消費者會從分區的??最新位置…

深度學習-損失函數

目錄 1. 線性回歸損失函數 1.1 MAE損失 1.2 MSE損失 2. CrossEntropyLoss 2.1 信息量 2.2 信息熵 2.3 KL散度 2.4 交叉熵 3. BCELoss 4. 總結 1. 線性回歸損失函數 1.1 MAE損失 MAE&#xff08;Mean Absolute Error&#xff0c;平均絕對誤差&#xff09;通常也被稱…

第六篇:linux之解壓縮、軟件管理

第六篇&#xff1a;linux之解壓縮、軟件管理 文章目錄 第六篇&#xff1a;linux之解壓縮、軟件管理一、解壓和壓縮1、window壓縮包與linux壓縮包能否互通&#xff1f;2、linux下壓縮包的類型3、打包與壓縮 二、軟件管理1、rpm1、什么是rpm&#xff1f;2、rpm包名組成部分3、如何…

Redis 鍵管理

Redis 鍵管理 以下從鍵重命名、隨機返回鍵、鍵過期機制和鍵遷移四個維度展開詳細說明&#xff0c;結合 Redis 核心命令與底層邏輯進行深入分析&#xff1a; 一、鍵重命名 1. ?RENAME?? 與 ?RENAMENX?? **RENAME key newkey?**&#xff1a; 功能&#xff1a;強制重命名…

OpenCV 模板匹配方法詳解

文章目錄 1. 什么是模板匹配&#xff1f;2. 模板匹配的原理2.1數學表達 3. OpenCV 實現模板匹配3.1基本步驟 4. 模板匹配的局限性5. 總結 1. 什么是模板匹配&#xff1f; 模板匹配&#xff08;Template Matching&#xff09;是計算機視覺中的一種基礎技術&#xff0c;用于在目…

TextCNN 模型文本分類實戰:深度學習在自然語言處理中的應用

在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;文本分類是研究最多且應用最廣泛的任務之一。從情感分析到主題識別&#xff0c;文本分類技術在眾多場景中都發揮著重要作用。最近&#xff0c;我參與了一次基于 TextCNN 模型的文本分類實驗&#xff0c;從數據準備到…

Qt-創建模塊化.pri文件

文章目錄 一、.pri文件的作用與基本結構作用基本結構 二、創建.pri文件如何添加模塊代碼&#xff1f; 一、.pri文件的作用與基本結構 作用 在Qt開發中&#xff0c;.pri文件&#xff08;Project Include File&#xff09;是一種配置包含文件&#xff0c;用于模塊化管理和復用項…

SpringCloud組件——Eureka

一.背景 1.問題提出 我們在一個父項目下寫了兩個子項目&#xff0c;需要兩個子項目之間相互調用。我們可以發送HTTP請求來獲取我們想要的資源&#xff0c;具體實現的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 舉個例子&#x…

EAL4+與等保2.0:解讀中國網絡安全雙標準

EAL4與等保2.0&#xff1a;解讀中國網絡安全雙標準 在當今數字化時代&#xff0c;網絡安全已成為各個行業不可忽視的重要議題。特別是在金融、政府、醫療等領域&#xff0c;保護信息的安全性和隱私性顯得尤為關鍵。在中國&#xff0c;EAL4和等級保護2.0&#xff08;簡稱“等保…

FFmpeg+Nginx+VLC打造M3U8直播

一、視頻直播的技術原理和架構方案 直播模型一般包括三個模塊&#xff1a;主播方、服務器端和播放端 主播放創造視頻&#xff0c;加美顏、水印、特效、采集后推送給直播服務器 播放端&#xff1a; 直播服務器端&#xff1a;收集主播端的視頻推流&#xff0c;將其放大后推送給…

【Redis】緩存三劍客問題實踐(上)

本篇對緩存三劍客問題進行介紹和解決方案說明&#xff0c;下篇將進行實踐&#xff0c;有需要的同學可以跳轉下篇查看實踐篇&#xff1a;&#xff08;待發布&#xff09; 緩存三劍客是什么&#xff1f; 緩存三劍客指的是在分布式系統下使用緩存技術最常見的三類典型問題。它們分…

Flink 2.0 編譯

文章目錄 Flink 2.0 編譯第一個問題 java 版本太低maven 版本太低maven 版本太高開始編譯擴展多版本jdk 配置 Flink 2.0 編譯 看到Flink2.0 出來了&#xff0c;想去玩玩&#xff0c;看看怎么樣&#xff0c;當然第一件事&#xff0c;就是編譯代碼&#xff0c;但是沒想到這么多問…

獲取印度股票市場列表、查詢IPO信息以及通過WebSocket實時接收數據

為了對接印度股票市場&#xff0c;獲取市場列表、查詢IPO信息、查看漲跌排行榜以及通過WebSocket實時接收數據等步驟。 1. 獲取市場列表 首先&#xff0c;您需要獲取支持的市場列表&#xff0c;這有助于了解哪些市場可以交易或監控。 請求方法&#xff1a;GETURL&#xff1a…

云原生--CNCF-1-云原生計算基金會介紹(云原生生態的發展目標和未來)

1、CNCF定義與背景 云原生計算基金會&#xff08;Cloud Native Computing Foundation&#xff0c;CNCF&#xff09;是由Linux基金會于2015年12月發起成立的非營利組織&#xff0c;旨在推動云原生技術的標準化、開源生態建設和行業協作。其核心目標是通過開源項目和社區協作&am…

【Rust 精進之路之第5篇-數據基石·下】復合類型:元組 (Tuple) 與數組 (Array) 的定長世界

系列&#xff1a; Rust 精進之路&#xff1a;構建可靠、高效軟件的底層邏輯 作者&#xff1a; 碼覺客 發布日期&#xff1a; 2025-04-20 引言&#xff1a;從原子到分子——組合的力量 在上一篇【數據基石上】中&#xff0c;我們仔細研究了 Rust 的四種基本標量類型&#xff1…

MongoDB 集合名稱映射問題

項目場景 在使用 Spring Data MongoDB 進行開發時&#xff0c;定義了一個名為 CompetitionSignUpLog 的實體類&#xff0c;并創建了對應的 Repository 接口。需要明確該實體類在 MongoDB 中實際對應的集合名稱是 CompetitionSignUpLog 還是 competitionSignUpLog。 問題描述 …

物聯網 (IoT) 安全簡介

什么是物聯網安全&#xff1f; 物聯網安全是網絡安全的一個分支領域&#xff0c;專注于保護、監控和修復與物聯網&#xff08;IoT&#xff09;相關的威脅。物聯網是指由配備傳感器、軟件或其他技術的互聯設備組成的網絡&#xff0c;這些設備能夠通過互聯網收集、存儲和共享數據…

PCB原理圖解析(炸雞派為例)

晶振 這是外部晶振的原理圖。 32.768kHz 的晶振&#xff0c;常用于實時時鐘&#xff08;RTC&#xff09;電路&#xff0c;因為它的頻率恰好是一天的分數&#xff08;32768 秒&#xff09;&#xff0c;便于實現秒計數。 C25 和 C24&#xff1a;兩個 12pF 的電容&#xff0c;用于…

Jupyter Notebook 中切換/使用 conda 虛擬環境的方式(解決jupyter notebook 環境默認在base下面的問題)

使用 nb_conda_kernels 添加所有環境 一鍵添加所有 conda 環境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…