C++之unordered_map/set的使用

前面我們已經學習了STL中底層為紅黑樹結構的一系列關聯式容器——set/multiset 和 map/multimap(C++98).


unordered系列關聯式容器

C++98中, STL提供了底層為紅黑樹結構的一系列關聯式容器, 在查詢時效率可達到log2N,即最差情況下需要比較紅黑樹的高度次, 當樹中的節點非常多時, 查詢效率也不理想.

最好的查詢是, 進行很少的比較次數就能夠將元素找到, 因此在C++11中, STL又提供了4個unordered系列的關聯式容器, 這四個容器與紅黑樹結構的關聯式容器使用方式基本類似, 只是其底層結構不同.


map,set系列容器和unordered_map,unordered_set系列容器的區別?

1.它們的底層結構是不一樣的:

set/multiset 和 map/multimap它們的底層結構是紅黑樹, 而unordered系列的——unordered_map/unordered_multimap, unordered_set/unordered_multiset它們的底層是哈希表.

unordered系列中, 帶multi的和不帶multi的區別也是允許鍵值重復出現和不允許重復出現的問題.

2.從名字上我們其實就能得出它們的第二個區別:

unordered是無序的意思,?所以map和set我們用迭代器遍歷, 得到的是有序的序列, unordered系列去遍歷的話, 得到的是無序的,?單從使用上來說最大的區別就是有沒有序的問題.

3.map和set系列它們的迭代器是雙向迭代器,?而unordered系列它們的迭代器是單向迭代器.

4. unorder _ map 容器通過鍵訪問單個元素的速度比 map 容器快, 盡管它們通過元素的子集進行范圍迭代的效率通常較低.(和底層實現有關)


?unordered_map和unordered_set的使用

單從使用來說, 這和set/multiset 和 map/multimap的使用用法基本一致, 常用的接口都差不多.

unordered_map的接口:

unordered_map的構造:

函數聲明功能介紹
unordered_map構造不同格式的unordered_map對象

?unordered_map的容量:

函數聲明功能介紹
bool empty() const檢測unordered_map是否為空
size_t size() const獲取unordered_map的有效元素個數

unordered_map的迭代器:

函數聲明功能介紹
begin返回unordered_map第一個元素的迭代器
end返回unordered_map最后一個元素下一個位置的迭代器
cbegin返回unordered_map第一個元素的const迭代器
cend返回unordered_map最后一個元素下一個位置的const迭代器

unordered_map的元素訪問:

函數聲明功能介紹
operator[]返回與key對應的value

注意: 該函數中實際調用哈希桶的插入操作, 用參數key與V()構造一個默認值往底層哈希桶
中插入, 如果key不在哈希桶中, 插入成功, 返回V(); 插入失敗, 說明key已經在哈希桶中,
將key對應的value返回

unordered_map的查詢:

函數聲明功能介紹
iterator find(const K& key)返回key在哈希桶中的位置
size_t count(const K& key)返回哈希桶中關鍵碼為key的鍵值對的個數

注意:?unordered_map中key是不能重復的,因此count函數的返回值最大為1?

unordered_map的修改:

函數聲明功能介紹
insert向容器中插入鍵值對
erase刪除容器中的鍵值對
void clear()清空容器中有效元素個數
void swap(unordered_map&)交換兩個容器中的元素

unordered_map的桶操作:

函數聲明功能介紹
size_t bucket_count()const返回哈希桶中桶的總個數
size_t bucket_size(size_t n)const返回n號桶中有效元素的總個數
size_t bucket(const K& key)返回元素key所在的桶號

它的迭代器沒有rbegin、rend, 因為它的迭代器是單向的,不支持反向遍歷。


?unordered_set的接口:

?接口也都差不多,只是set系列的沒有[]和at接口.

#include<set>
#include<unordered_set>
#include<iostream>
using namespace std;int main()
{set<int> s1;unordered_set<int> s2;s1.insert(1);s1.insert(5);s1.insert(4);s1.insert(3);s1.insert(8);for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)cout << *it << " ";
//cout << endl;
//s2.insert(1);s2.insert(5);s2.insert(4);s2.insert(3);s2.insert(8);for (unordered_set<int>::iterator it = s2.begin(); it != s2.end(); it++)cout << *it << " ";return 0;
}

?

可以看到set按迭代器訪問是有序的, unordered_set按迭代器訪問是按照插入順序訪問的, unordered_map也是一樣.


set與unordered_set性能對比?

void test2()
{srand(time(nullptr));size_t N = 1000000;unordered_set<int> us;set<int> s;vector<int> v;v.reserve(N);for (size_t i = 0; i < N; i++){v.push_back(rand()+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;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;}

所以, 綜合而言, unordered系列的效率是比較高的, 尤其是find的效率.


OJ例題

349. 兩個數組的交集 - 力扣(LeetCode)?

map和set的例題-CSDN博客

之前有用set的解法, 排序加去重可以解決, 現在可以用unordered_set, unordered_set雖然不能排序, 但是也是可以去重的, 首先我們先對兩個數組進行去重, 然后, 我們遍歷其中一個數組, 遍歷的同時去依次判斷當前元素在不在另一個數組中, 如果在就是交集。


?350. 兩個數組的交集 II - 力扣(LeetCode)

返回結果中每個元素出現的次數, 應與元素在兩個數組中都出現的次數一致(如果在兩數組中出現次數不一致,則考慮取較小值), 但是它沒有要去輸出結果中每個元素是唯一的。?


?

統計次數, 判斷有沒有次數大于1的就行了:


?884. 兩句話中的不常見單詞 - 力扣(LeetCode)

這道題其實可以求轉化成兩個字符串合并后, 只出現一次的單詞.

?

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

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

相關文章

3 動態規劃解解碼問題

來源&#xff1a;LeetCode第91題 難度&#xff1a;中等 描述&#xff1a;一條包含字母A-Z的消息通過以下映射進行了編碼: A->1,B->2,z->26,要接嗎已編碼的消息&#xff0c;所有數字必須基于上述映射的方法&#xff0c;反向映射回字母(可能由多種方法)&#xff0c;例…

MindStudio學習一 整體介紹

一場景介紹 二 安裝介紹 1.LINUX 采用無昇騰硬件采用linux 分部署 2.WINDOWS 3.linux下安裝整體步驟 3.1安裝依賴 3.2 安裝步驟 1.gcc cmake 等依賴 2.python3.7.5 3.pip 安裝依賴 4.安裝JDK 5.安裝 Ascend-cann-toolkit 6.解壓安裝Mindstudio 7.進入bin路徑 ./…

MySQL where 子句

文章目錄 前言MySQL where 子句語法 從命令提示符中讀取數據使用PHP腳本讀取數據后言 前言 hello world歡迎來到前端的新世界 &#x1f61c;當前文章系列專欄&#xff1a;Mysql &#x1f431;?&#x1f453;博主在前端領域還有很多知識和技術需要掌握&#xff0c;正在不斷努力…

Javascript的form表單校驗輸入框

以下是HTML代碼&#xff1a; <form name"myForm" onsubmit"return validateForm()"><label for"name">姓名&#xff1a;</label><input type"text" id"name" name"name"><br><l…

【ArcGIS Pro微課1000例】0035:柵格影像拼接(dem高程數據)

本實驗講解在ArcGIS Pro中,柵格數據的兩種拼接(鑲嵌)方法,適用于遙感影像、DOM、DEM、DSM等常見柵格數據。 文章目錄 一、加載實驗數據二、柵格拼接工具1. 鑲嵌2. 鑲嵌至新柵格三、注意事項四、拓展閱讀一、加載實驗數據 加載配套實驗數據中的0035.rar中的兩個dem數據,如…

455.分發餅干

原題鏈接&#xff1a;455.分發餅干 思路&#xff1a; 先使用大餅干喂飽大胃口的&#xff0c;再到剩余的里面用大餅干喂剩下大胃口的 &#xff0c;直到全部滿足或者喂不了了為止。 全代碼&#xff1a; class Solution { public:int findContentChildren(vector<int>&am…

【從刪庫到跑路】MySQL數據庫 — E-R圖 | 關系模型

&#x1f38a;專欄【MySQL】 &#x1f354;喜歡的詩句&#xff1a;更喜岷山千里雪 三軍過后盡開顏。 &#x1f386;音樂分享【如愿】 大一同學小吉&#xff0c;歡迎并且感謝大家指出我的問題&#x1f970; 文章目錄 &#x1f339;簡述什么是E-R圖?核心概念 &#x1f339;E-R圖…

LeetCode40. Combination Sum II

文章目錄 一、題目二、題解 一、題目 Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target. Each number in candidates may only be used once in…

完美解決:Nginx訪問PHP出現File not found.

目錄 解決方法一&#xff1a; 解決方法二&#xff1a; 遇到 File not found. 出現的問題解決&#xff1a; 解決方法一&#xff1a; 修改nginx的主配置文件。 vi /etc/nginx/nginx.conf location ~ \.php$ { root html; fastcgi_pass …

unity Toggle,初始時默認不選中,若選中則不可取消選中。不寫碼實現其效果

實現效果&#xff1a; 初始默認時&#xff1a; 選中時&#xff1a; 零代碼實現&#xff1a; 步驟1 步驟2 步驟3

[autojs]ui線程中更新控件的值的問題

"ui"; ui.layout(<vertical><button id"autoFloatWindow" text"開啟懸浮窗" textSize"15sp" /><button id"autoService" text"開啟無障礙服務" textSize"15sp" /><button id"…

一篇總結 Linux 系統啟動的幾個匯編指令

學習 Linux 系統啟動流程&#xff0c;必須熟悉幾個匯編指令&#xff0c;總結給大家。 這里不是最全的&#xff0c;只列出一些最常用的匯編指令。 一&#xff0e;數據處理指令 1.數據傳送指令 【MOV指令】 把一個寄存器的值(立即數)賦給另一個寄存器&#xff0c;或者將一個…

Python---函數的參數類型

位置參數 理論上&#xff0c;在函數定義時&#xff0c;我們可以為其定義多個參數。但是在函數調用時&#xff0c;我們也應該傳遞多個參數&#xff0c;正常情況&#xff0c;其要一一對應。 相關鏈接&#xff1a;Python---函數的作用&#xff0c;定義&#xff0c;使用步驟&…

opencv 常用操作指南

1.通道交換 讀取圖像&#xff0c;然后將RGB通道替換成BGR通道&#xff0c;需要注意的是&#xff0c;opencv讀取的圖像默認是BGR。cv2.cvtColor函數可以參考Color Space Conversions img cv2.imread(imori.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) cv2.imwrite(answe…

1|1111

1、指定在每天凌晨4&#xff1a;00將該時間點之前的系統日志信息&#xff08;/var/log/messages &#xff09;備份到目錄下/backup&#xff0c;備份后日志文件名顯示格式logfileYY-MM-DD-HH-MM 2、配置ssh免密登陸&#xff1a;客戶端主機通過redhat用戶基于秘鑰驗證方式進行遠…

微服務實戰系列之Nginx

前言 Nginx&#xff1f;寫了那么多文章&#xff0c;為什么今天才輪到它的表演&#xff1f;那是因為它實在太重要了&#xff0c;值得大書特書&#xff0c;特別對待。 當我們遇到單點瓶頸&#xff0c;第一個idea是&#xff1f;Nginx&#xff1b; 當我們需要反向代理&#xff0c;…

機器學習/sklearn筆記:MeanShift

1 算法介紹 一種基于質心的算法通過更新候選質心使其成為給定區域內點的均值候選質心的位置是通過一種稱為“爬山”技術迭代調整的&#xff0c;該技術找到估計的概率密度的局部最大值 1.1 基本形式 給定d維空間的n個數據點集X&#xff0c;那么對于空間中的任意點x的均值漂移…

C#,《小白學程序》第一課:初識程序,變量,數據與顯示

曰&#xff1a;掃地僧練就絕世武功的目的是為了掃地更干凈。 1 引言 編程只是一項技術&#xff0c;如包包子&#xff0c;不是什么高深的科學。 學習程序最不好的方法是先學習枯燥的語法。 學習程序主要是用代碼解決問題。因此&#xff0c;我們拋開所有的語法與諸多廢物&…

React項目中發生空白但不報錯的原因分析和解決?

文章目錄 前言組件渲染問題狀態管理問題異步操作問題代碼錯誤但未拋出異常如果我們使用的是chorme瀏覽器的話&#xff0c;可以下載一個開發者工具&#xff0c;例如下圖&#xff1a;代碼審查使用調試工具日志和輸出檢查外部依賴異步操作終極大法&#xff0c;不到萬不得已不可以使…

python+gurobi求解線性規劃、整數規劃、0-1規劃

文章目錄 簡單回顧線性規劃LP整數規劃IP0-1規劃 簡單回顧 線性規劃是數學規劃中的一類最簡單規劃問題&#xff0c;常見的線性規劃是一個有約束的&#xff0c;變量范圍為有理數的線性規劃。如&#xff1a; 使用matlab的linprog函數即可求解簡單的線性規劃問題&#xff0c;可以參…