unordered_map 與 unordered_set 的使用

unordered_map

unordered_map 的介紹文檔

unordered_map 的介紹文檔:來自cpluscplus.com 的中文翻譯

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

unordered_map 是 C++11 的語法,C++98 是沒有 unordered_map

構造函數

unordered_map 存儲的數據是:key-value 的結構,因此實例化 unordered_map 需要傳入兩個模板參數。unordered-map 的底層數據結構是哈希表。unordered_map 數據 key-value 形式的存儲你可以理解為哈希表存儲了一個 pair 。傳入的第一個模板參數就是 pair 的 first,傳入的第二個模板參數就是 pair 的 second。

  • unordered_map 可以無參構造,這是在做算法題用的比較多的。
  • unordered_map 可以使用 initializer_list 來初始化。initializer_list 是 C++11 的語法。
#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash1; //這是無參構造unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //這是使用initializer_list來構造return 0;
}

bool empty() const

這個函數用來判斷哈希表是否為空,為空返回 true;否則返回 false。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash1; //這是無參構造unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //這是使用initializer_list來構造cout << hash1.empty() << endl; //輸出:1cout << hash2.empty() << endl; //輸出:0return 0;
}

size_t size() const

這個函數用來獲取哈希表中有效元素的個數。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash1; //這是無參構造unordered_map<int, int> hash2({{1,1}, {2,2}, {3,3}}); //這是使用initializer_list來構造cout << hash1.size() << endl; //輸出:1cout << hash2.size() << endl; //輸出:3return 0;
}

迭代器

  • begin:返回哈希表中第一個元素的位置對應的迭代器。
  • end:返回的迭代器并不指向任何元素,而是指向容器中最后一個元素之后的位置。因此,返回的值不應被取消引用。
    有了 begin 和 end 迭代器,我們就可以遍歷 unordered_map 了。
#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造auto it = hash2.begin();while(it != hash2.end()){cout << it->first << " " << it->second << endl;++it;}return 0;
}

在這里插入圖片描述
我們看到最后遍歷得到的結果與插入的順序并不相同。這也證明了 unordered_map 是一個無序容器。僅僅存儲一個 key-value 的數據。

const V& operator[](const K& key)

這個函數和 mapoperator[] 很像。
如果 key 與容器中某個元素的鍵相匹配,函數會返回其映射值(value)的引用。

如果 key 與容器中任何元素的鍵不匹配,函數將插入一個具有該鍵的新元素,并返回其映射值的引用。請注意,即使沒有為元素分配映射值(元素是使用默認構造函數構造的),容器的大小也會增加一個。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造cout << hash2[10] << endl; //輸出:10hash2[40]; // 使用 operator[] 訪問key為 40 的元素,但是不存在,會插入一個 key 為 40 的元素,value我們沒有指定,那么會調用 value 類型的默認構造函數:int() 作為 40 這個 key 值的 value 值cout << hash2[40] << endl; //輸出:0return 0;
}

iterator find(const K& key)

unordered_map 中查找 key,如果查找成功返回該位置對應的迭代器,如果查找失敗,那么返回 unordered_map::end ,就是 end 迭代器。
下面的代碼中,我們使用 find 查找一個元素,通過得到的迭代器訪問他的 value。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造auto it = hash2.find(10);if(it == hash2.end()) cout << "此元素不存在" << endl;else cout << it->second << endl; //輸出:10return 0;
}

size_t count(const K& key) const

搜索容器中鍵為 key 的元素,并返回找到的元素個數。由于 unordered_map 容器不允許鍵重復,這意味著如果容器中存在鍵為 key 的元素,函數實際返回 1,否則返回 0。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造cout << hash2.count(10) << endl; //輸出:1cout << hash2.count(40) << endl; //輸出:0return 0;
}

pair<iterator, bool> insert ( const pair<K, V>& kv )

這個函數和 mapinsert 完全一樣。
你可以向 unordered_map 中插入一個鍵值對。
函數返回一個 pair 對象,其第一個元素是一個迭代器,指向容器中新插入的元素或鍵等價的元素,另一個 bool 值表示該元素是否插入成功。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造pair<unordered_map<int, int>::iterator, bool> ret1 = hash2.insert(make_pair(40, 40));cout << "插入成功與否:" << ret1.second << endl; //插入成功,ret1.second 為 1pair<unordered_map<int, int>::iterator, bool> ret2 = hash2.insert(make_pair(30, 0));cout << ret2.first->second << endl; //插入失敗,得到的是原 key 為 30 的元素對應的 value:30 而不是新插入的 0return 0;
}

insert 函數也可以插入 initializer_list 和構造函數那里一樣:
hash2.insert({60,60})

erase 函數

erase 有三個重載的版本:
在這里插入圖片描述

  • 第一個版本:刪除一個迭代器位置的元素。
  • 第二個版本:刪除鍵為 k 的元素。
  • 第三個版本:刪除一個迭代器區間。
#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造hash2.erase(hash2.begin()); //第一個版本hash2.erase(30); //第二個版本hash2.erase(hash2.begin(), hash2.end()); //第三個版本return 0;
}

void clear() const

清空 unordered_map 中所有的元素。

#include<iostream>
#include<unordered_map>
using namespace std;int main()
{unordered_map<int, int> hash2({{10,10}, {20,20}, {30,30}}); //這是使用initializer_list來構造hash2.clear();cout << hash2.size() << endl; // 輸出:0return 0;
}

unordered_set

這是 unordered_set 的介紹文檔:來自 cpluscplus.com。

  • unordered_set 是一種不按特定順序存儲唯一元素的容器,可以根據元素的值快速檢索單個元素。

  • 在 unordered_set 中,元素的值同時也是其鍵,可以唯一地識別該元素。鍵是不可變的,因此,unordered_set 中的元素一旦進入容器就不能修改,但可以插入和移除。

  • 在內部,unordered_set 中的元素不按任何特定順序排序,而是根據它們的哈希值組織成桶,以便直接按其值快速訪問單個元素(平均時間復雜度不變)。

  • 無序集容器在按鍵訪問單個元素時比集合容器更快,但在對元素子集進行范圍迭代時,其效率通常較低。

  • 容器中的迭代器至少是前向迭代器。

unordere_set 存儲的數據只有一個 key。
unordered_set 與 unordered_map 的接口完全相同。這里就不再贅述了。

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

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

相關文章

JAVA爬蟲2 - Jsoup解析、對接MySQL、多線程爬蟲、json庫使用

官網:https://jsoup.org/download Jsoup是一款基于Java的HTML解析器,它可以方便地從網頁中抓取和解析數據。它的主要作用是幫助開 發者處理HTML文檔,提取所需的數據或信息。下面介紹幾個常用的API: 選擇器(Selector)API:用于根據CSS選擇器語法選擇HTML元素。 屬性(Attribute…

【MySQL】寶塔面板結合內網穿透實現公網遠程訪問

文章目錄 前言1.Mysql服務安裝2.創建數據庫3.安裝cpolar3.2 創建HTTP隧道4.遠程連接5.固定TCP地址5.1 保留一個固定的公網TCP端口地址5.2 配置固定公網TCP端口地址 前言 寶塔面板的簡易操作性,使得運維難度降低,簡化了Linux命令行進行繁瑣的配置,下面簡單幾步,通過寶塔面板cpo…

圖片轉成dds格式

在 CentOS 系統中&#xff0c;可以使用 ImageMagick 工具將圖片格式轉換為 DDS 格式。首先需要安裝 ImageMagick&#xff0c;然后使用 convert 命令進行轉換。 1.安裝 ImageMagick&#xff1a; 在Ubuntu或Debian系統上安裝ImageMagick sudo apt-get update sudo apt-get ins…

pip配置清華鏡像源加速下載

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

(C)一些題3

1. #include<stdio. h> void main () { int k10000; do { k; printf (“%d\n",k) ; }while (k>10000);//不是死循環&#xff0c;因為%d有范圍&#xff0c;超限后為負數&#xff0c;所以退出循環 2. #include<stdio. h> void main &#xff08;&#x…

BMS基礎知識:BMS基本功能,鉛酸和鋰電池工作原理,電池系統的重要概念!

筆者有話說&#xff1a; 作為BMS從業者來講&#xff0c;目前接觸的BMS系統并不是很高大尚&#xff0c;但基礎功能都是有的。 關于BMS的基本功能&#xff0c;工作原理&#xff0c;運行邏輯等&#xff0c;在此做一個梳理&#xff0c;講一些最基礎的掃盲知識&#xff0c;可以作為…

正則限制文件上傳的格式

if (!/(PNG|JPG|JPEG)/i.test(file.type)) {//file.type文件類型alert(上傳的文件只能是 PNG/JPG/JPEG 格式的~~);return;}

誤碼率測試腳本

簡介 高速信號完整性測試 高速信號完整性測試(High-speed signal integrity testing)是指對高速數字信號在傳輸過程中的一些關鍵參數進行測試和分析,以確保信號能夠在系統中正常傳輸,并且不會發生失真、串擾、抖動等問題。 高速信號完整性測試通常涉及到許多參數,包括信…

Java 實現視頻轉音頻功能

在實際開發中,我們經常需要處理各種多媒體文件。本文將介紹如何使用 Java 語言實現將視頻文件轉換為音頻文件的功能。我們將使用 FFmpeg 工具來進行視頻轉換操作,并通過 Java 的 ProcessBuilder 實現調用系統命令執行 FFmpeg 的功能。 準備工作 首先,我們需要確保系統中已安…

python爬蟲中 HTTP 到 HTTPS 的自動轉換

前言 在當今互聯網世界中&#xff0c;隨著網絡安全的重要性日益增加&#xff0c;越來越多的網站采用了 HTTPS 協議來保護用戶數據的安全。然而&#xff0c;許多網站仍然支持 HTTP 協議&#xff0c;這就給我們的網絡爬蟲項目帶來了一些挑戰。為了應對這種情況&#xff0c;我們需…

一文掌握 Spring Boot 常用注解,保姆級整理,建議收藏!

親兄弟篇&#xff1a; SpringBoot注解大全&#xff08;超詳細&#xff09;_Maiko Star的博客-CSDN博客 一、SpringBoot常用注解 二、Bean處理注解 2.1 Resource 依賴注入&#xff0c;自動導入標注的對象到當前類中&#xff0c;比如我們的 Controller 類通常要導入 Service 類…

前端編碼技巧須知

前端開發中可能會使用到以下軟件&#xff0c;它們各自具有不同的作用&#xff1a; 代碼編輯器&#xff1a;例如Sublime Text、Atom、Visual Studio Code等&#xff0c;用于編寫和編輯HTML、CSS和JavaScript等前端代碼。網頁瀏覽器&#xff1a;例如Chrome、Firefox、Safari等&a…

多線程工具類ExecutorService的使用(所有任務執行完成后獲取最終結果)

我們經常會有這種需求&#xff0c;比如APP首頁&#xff0c;需要同時加載20多個接口&#xff0c;你怎么做&#xff1f;一個個按順序調用接口嗎&#xff1f;如果網絡通暢還好&#xff0c;如果網絡不好&#xff0c;你可能會讓首頁加載幾分鐘&#xff0c;用戶體驗肯定不好&#xff…

來聊聊JVM中的類加載過程以及雙親委派模型(學習Java必知內容)

文章目錄 1. 類加載過程加載驗證準備解析初始化 2. 雙親委派模型一個類的加載流程雙親委派模型的優點 總結 1. 類加載過程 在整個 JVM 執行過程中, 和我們程序員關系最密切的就是類加載的過程, 所以接下來我們來看下類加載的執行流程. 對于一個類來說, 它的生命周期是這樣的:…

python pymodbus庫使用教程(以Modbus RTU為例)

文檔&#xff1a; https://pymodbus.readthedocs.io/en/latest/ 源碼&#xff1a; https://github.com/riptideio/pymodbus/ 文章目錄 Python PyModbus庫使用教程&#xff1a;以Modbus RTU為例介紹安裝PyModbus配置串行連接導入必要的模塊創建Modbus客戶端實例 建立連接連接…

UEC++ day8

傷害系統 給敵人創建血條 首先添加一個UI界面用來顯示敵人血條設置背景圖像為黑色半透明 填充顏色 給敵人類添加兩種狀態表示血量與最大血量&#xff0c;添加一個UWidegtComponet組件與UProgressBar組件 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "Enemy …

TikTok歷史探秘:短視頻中的時間之旅

在數字時代的浪潮中&#xff0c;TikTok嶄露頭角&#xff0c;成為社交媒體領域的一顆耀眼新星。這款短視頻應用以其獨特的創意、時尚和娛樂性質&#xff0c;吸引了全球數以億計的用戶。 然而&#xff0c;TikTok并非一夜之間的奇跡&#xff0c;它背后蘊藏著豐富而有趣的歷史故事…

[ChatGPT]ChatGPT免費,不用翻墻!?——你需要的裝備

系列文章目錄 【AIGC】服務于人類&#xff5c;一種新的人工智能技術-CSDN博客 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、天意云網站 ?編輯 二、使用步驟 可以看到有云服務器、Rstudio以及我們的ChatGPT&#xff0c;我這次主要分享ChatGPT&#xff0c;其他的有機會我再給…

常用服務注冊中心與發現(Eurake、zookeeper、Nacos)筆記(一)基礎概念

基礎概念 注冊中心 在服務治理框架中&#xff0c;通常都會構建一個注冊中心&#xff0c;每個服務單元向注冊中心登記自己提供的服務&#xff0c;將主機與端口號、版本號、通信協議等一些附加信息告知注冊中心&#xff0c;注冊中心按照服務名分類組織服務清單&#xff0c;服務…

電力感知邊緣計算網關產品設計方案-軟件架構(業務流程)

軟件架構(業務流程) 基于前端系統提供的硬件通信平臺,后端系統以控制執行單元為核心,協同控制通信管理、驅動適配、存儲單元等職能單元完成與前端系統的通信數據交互業務,在經歷以下業務流程后,完成設備自適應通信業務功能。 1.外部設備通信前端系統 前端系統連接新的…