unordered_set 的常用函數

在 C++ 的標準庫中,std::unordered_set?是基于哈希表實現的哈希集合。下面介紹這種語言里哈希集合的常用函數。

C++?std::unordered_set

1. 元素操作

  • insert
    • 功能:向哈希集合中插入元素。如果元素已經存在,則不會重復插入。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset;uset.insert(1);uset.insert(2);for (auto num : uset) {std::cout << num << " ";}return 0;
}

  • erase
    • 功能:從哈希集合中移除指定元素。可以通過元素值或者迭代器來指定要移除的元素。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset = {1, 2, 3};uset.erase(2);for (auto num : uset) {std::cout << num << " ";}return 0;
}

  • find
    • 功能:查找指定元素。如果找到,返回指向該元素的迭代器;如果未找到,返回?end()?迭代器。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset = {1, 2, 3};auto it = uset.find(2);if (it != uset.end()) {std::cout << "Found: " << *it << std::endl;} else {std::cout << "Not found" << std::endl;}return 0;
}

  • count
    • 功能:統計指定元素在哈希集合中的數量。由于哈希集合中元素唯一,返回值要么是 0(元素不存在),要么是 1(元素存在)。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset = {1, 2, 3};std::cout << "Count of 2: " << uset.count(2) << std::endl;return 0;
}
2. 容量相關

  • empty
    • 功能:檢查哈希集合是否為空。如果為空,返回?true;否則返回?false
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset;std::cout << "Is empty: " << (uset.empty() ? "Yes" : "No") << std::endl;uset.insert(1);std::cout << "Is empty: " << (uset.empty() ? "Yes" : "No") << std::endl;return 0;
}

  • size
    • 功能:返回哈希集合中元素的數量。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset = {1, 2, 3};std::cout << "Size: " << uset.size() << std::endl;return 0;
}

  • max_size
    • 功能:返回哈希集合所能容納的最大元素數量,這取決于系統和庫的實現。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset;std::cout << "Max size: " << uset.max_size() << std::endl;return 0;
}
3. 迭代器相關

  • begin?和?end
    • 功能begin()?返回指向哈希集合首元素的迭代器,end()?返回指向哈希集合尾后位置的迭代器,可用于遍歷哈希集合。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset = {1, 2, 3};for (auto it = uset.begin(); it != uset.end(); ++it) {std::cout << *it << " ";}return 0;
}

  • cbegin?和?cend
    • 功能:與?begin()?和?end()?類似,但返回的是常量迭代器,不能用于修改元素。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {const std::unordered_set<int> uset = {1, 2, 3};for (auto it = uset.cbegin(); it != uset.cend(); ++it) {std::cout << *it << " ";}return 0;
}

在 C++ 中,標準庫提供了基于哈希表實現的容器?std::unordered_map(存儲鍵值對)和?std::unordered_set(存儲單一元素),下面詳細介紹它們除了前面提到之外的常見函數和用法。

std::unordered_map

元素操作類

  • emplace
    • 功能:原位構造元素并插入到?unordered_map?中。與?insert?不同,emplace?可以直接使用構造函數的參數來構造元素,避免了臨時對象的創建和拷貝。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap;umap.emplace(1, "one");for (const auto& pair : umap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

  • emplace_hint
    • 功能:與?emplace?類似,但可以提供一個迭代器作為插入位置的提示,幫助提高插入效率。不過,這只是一個提示,插入位置不一定就是該迭代器所指的位置。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}};auto hint = umap.begin();umap.emplace_hint(hint, 3, "three");for (const auto& pair : umap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}

  • extract
    • 功能:從?unordered_map?中提取一個元素,將其從容器中移除,但保留其資源,可用于后續的插入操作。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}};auto node = umap.extract(1);if (node) {node.key() = 3;umap.insert(std::move(node));}for (const auto& pair : umap) {std::cout << pair.first << ": " << pair.second << std::endl;}return 0;
}
容量相關類

  • reserve
    • 功能:為?unordered_map?預留一定數量的桶(bucket),避免在插入元素時頻繁進行哈希表的擴容操作,從而提高插入效率。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap;umap.reserve(100);for (int i = 0; i < 50; ++i) {umap[i] = std::to_string(i);}return 0;
}

  • rehash
    • 功能:設置?unordered_map?的桶數量。如果指定的桶數量小于當前元素數量,可能會導致哈希表重新哈希以適應新的桶數量。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}};umap.rehash(10);return 0;
}
哈希策略相關類

  • load_factor
    • 功能:返回?unordered_map?當前的負載因子,即元素數量與桶數量的比值。負載因子過高可能會導致哈希沖突增加,影響性能。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap = {{1, "one"}, {2, "two"}};std::cout << "Load factor: " << umap.load_factor() << std::endl;return 0;
}

  • max_load_factor
    • 功能:可以設置或獲取?unordered_map?的最大負載因子。當負載因子超過最大負載因子時,哈希表會自動進行擴容。
    • 示例代碼

#include <iostream>
#include <unordered_map>
#include <string>int main() {std::unordered_map<int, std::string> umap;umap.max_load_factor(0.5);std::cout << "Max load factor: " << umap.max_load_factor() << std::endl;return 0;
}

std::unordered_set

std::unordered_set?的很多函數和用法與?std::unordered_map?類似,以下是一些額外的特點和示例:

元素操作類

  • emplace?和?emplace_hint
    • 功能:與?unordered_map?中的?emplace?和?emplace_hint?類似,用于原位構造元素并插入到?unordered_set?中。
    • 示例代碼

#include <iostream>
#include <unordered_set>int main() {std::unordered_set<int> uset;uset.emplace(1);auto hint = uset.begin();uset.emplace_hint(hint, 2);for (const auto& num : uset) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
容量和哈希策略相關類

unordered_set?同樣支持?reserverehashload_factor?和?max_load_factor?等函數,用法與?unordered_map?一致,用于管理容量和哈希策略。

?

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

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

相關文章

starrocks批量啟停腳本

#!/bin/bash # 定義 StarRocks 安裝目錄 STARROCKS_HOME"/path/to/starrocks" # 定義 FE 和 BE 節點列表 FE_NODES("fe_node1_ip" "fe_node2_ip" "fe_node3_ip") BE_NODES("be_node1_ip" "be_node2_ip" "be_…

python 提取視頻中的音頻

在Python中提取視頻中的音頻&#xff0c;你可以使用moviepy庫&#xff0c;這是一個非常強大且易于使用的庫&#xff0c;專門用于視頻編輯。以下是如何使用moviepy來提取視頻中的音頻的步驟&#xff1a; 安裝moviepy 首先&#xff0c;你需要安裝moviepy。你可以通過pip安裝它&a…

大語言模型打卡學習DAY1

學習目標&#xff1a; 語言模型的發展歷程 大模型的技術基礎 學習內容&#xff1a; 1. 語言模型的發展歷程 語言模型通常是指能夠建模自然語言文本生成概率的模型&#xff0c;從語言建模到任務求解&#xff0c;這是科學思維的一次重要躍升。2. 大語言模型技術基礎 定義&#…

boarding_passes(登機牌)表的作用

boarding_passes&#xff08;登機牌&#xff09;表的作用 boarding_passes 這張表的主要作用是記錄旅客的登機信息&#xff0c;包括&#xff1a; 票號 (ticket_no) - 關聯到 tickets 表&#xff0c;表示這張票屬于哪個旅客。航班 ID (flight_id) - 關聯到 flights 表&#xf…

Go語言為什么運行比Java快

文章目錄 前言一、核心區別二、Go Vs Java1.Go 的啟動比 Java 快&#xff1f;2.選 Go Or Java&#xff1f; 總結 前言 Go 和 Java 是兩種廣泛應用的編程語言&#xff0c;它們在語言特性、性能、生態、應用場景等方面存在顯著區別。以下是它們的核心區別&#xff0c;以及在實際…

java生成一個24位的字符串,要求這個字符串由大寫的英文字母和數字組成,長度固定位24位

import java.security.SecureRandom;public class RandomStringGenerator {// 定義允許的字符集&#xff08;大寫字母和數字&#xff09;private static final String ALLOWED_CHARACTERS "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";private static final SecureRando…

基于python的升級隊列加速決策

a-f大等級是3級 a-c建筑每升1級分別需要8天 d-f建筑每升1級分別需要10天 目前以下建筑隊列正在從0級升至1級 建筑A升級需要7天05&#xff1a;16&#xff1a;20 建筑b升級需要06&#xff1a;06&#xff1a;54 建筑c升級需要00&#xff1a;37&#xff1a;00 建筑d升級需要…

【經驗】Ubuntu|VMware 新建虛擬機后打開 SSH 服務、在主機上安裝vscode并連接、配置 git 的 ssh

常常有人問VMware-Tools裝了也復制粘貼不了怎么辦&#xff0c;這個東西影響因素太多了&#xff0c;我總是建議直接用SSH連接虛擬機。但是之前一直都沒有出教程&#xff0c;現在出一個簡單的教程。 文章目錄 在 Ubuntu 虛擬機&#xff08;VMware&#xff09;中開啟 SSH 服務、配…

C++多線程編程 3.互斥量、互斥鎖

目錄 1. 線程安全與互斥鎖&#xff08;std::mutex&#xff09; 2. 互斥量死鎖 3. std::lock_guard 4. std::unique_lock (1)示例 (2)詳細知識點 5. std::this_thread (1)sleep_for (2)sleep_until (3)yield (4)get_id 直接通過示例講解&#xff1a; 1. 線程安全與互…

【redis】hash基本命令和內部編碼

文章目錄 表示形式命令HSET 和 HGET HEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSETNXHINCRBYHINCRBYFLOAT命令小結內部編碼 表示形式 Redis 自身已經是鍵值對結構了 Redis 自身的鍵值對就是通過哈希的方式來組織的 把 key 這一層組織完成之后&#xff0c;到了 value 這一層&…

行為模式---策略模式

概念 策略模式是一種行為設計摸是&#xff0c;它的核心思想是將一些列的算法封裝成獨立的對象&#xff0c;并使它們可以相互替換&#xff0c;通過上下文進行調用。 策略模式通過算法抽象為獨立的策略類&#xff0c;客戶端可以根據自身需求選擇不同的策略類來完成任務、這種方…

Selenium 自動化測試學習總結

大概了解一下即可&#xff0c;現在主要用的自動化工具是 playWright&#xff0c;它可以錄制操作。 selenium是老款自動化測試工具&#xff0c;仍有很多可取之處。 安裝&#xff1a; pip install selenium即可。然后下載瀏覽器的驅動包&#xff0c;注意不是瀏覽器&#xff01;…

四層協議攻防手冊:從SYN Flood到UDP反射的深度防御

一、四層協議攻擊類型與特征 攻擊類型協議層特征SYN FloodTCP大量半開連接&#xff0c;SYN_RECV狀態堆積UDP反射放大UDP小請求包觸發大響應&#xff08;如NTP、DNS響應&#xff09;TCP分片攻擊TCP發送異常分片耗盡重組資源連接耗盡攻擊TCP建立大量空閑連接占用端口資源 二、TC…

【社區投稿】深入再談智能指針、AsRef引用與Borrow借用

深入再談智能指針、AsRef引用與Borrow借用 這是一個具有深度的技術主題。每次重溫其理論知識&#xff0c;都會有新的領悟。大約 2 年前&#xff0c;我曾就這一技術方向撰寫過另一篇短文《從類型轉換視角&#xff0c;淺談Deref<Target T>, AsRef<T>, Borrow<T&g…

外層元素旋轉,其包括在內的子元素一并旋轉(不改變旋轉中心),單元測試

思路&#xff1a;外層旋轉后坐標&#xff0c;元素旋轉后坐標&#xff0c;計算偏移坐標 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…

如何在虛擬機上安裝hadoop

與前面java的方式相同安裝好hadoop后進入hadoop的環境變量my_env.sh 輸入#?HADOOP_export HADOOP_HOME /opt/module/hadoop-3.1.3 export PATH$PATH:$HADOOP_HOME/bin export PATH$PATH:$HADOOP_HOME/sbin 再輸入hadoop測試是否安裝成功

WPF-DataGrid的增刪查改

背景&#xff1a;該功能為幾乎所有系統開發都需要使用的功能&#xff0c;現提供簡單的案例。 1、MyCommand using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace Wp…

Oracle數據庫存儲結構--物理存儲結構

數據庫存儲結構&#xff1a;分為物理存儲結構和邏輯存儲結構。 物理存儲結構&#xff1a;操作系統層面如何組織和管理數據 邏輯存儲結構&#xff1a;Oracle數據庫內部數據組織和管理數據&#xff0c;數據庫管理系統層面如何組織和管理數據 存儲結構 在Oracle數據庫的存儲結構…

歌詞相關實現

歌詞相關 歌詞數據模型&#xff1a; // Lyric.swift class Lyric: BaseModel {/// 是否是精確到字的歌詞var isAccurate:Bool false/// 所有的歌詞var datum:Array<LyricLine>! }// LyricLine.swift class LyricLine: BaseModel {/// 整行歌詞var data:String!/// 開始…

紡織服裝制造行業現狀 內檢實驗室系統在紡織服裝制造行業的應用

在紡織服裝制造行業&#xff0c;內檢實驗室LIMS系統&#xff08;實驗室信息管理系統&#xff09;已成為提升檢測效率、優化質量控制和滿足行業合規性要求的關鍵工具。隨著行業競爭的加劇和消費者對產品質量要求的提高&#xff0c;紡織服裝制造企業需要更加高效、準確的檢測流程…