当前位置: 首页 > news >正文

详解Rust标准库:HashSet

## 查看本地官方文档

安装rust后运行

rustup doc

查看The Standard Library即可获取标准库内容

std::collections::hash_set::HashSet定义

HashSet是一种集合数据结构,它只存储唯一的元素。它主要用于检查元素是否存在于集合中,或者对元素进行去重操作,两个键相等,则它们的哈希值必须相等

HashSet定义

// 默认哈希器为RandomState
pub struct HashSet<T, S = RandomState> {// 负责管理哈希表的存储和操作。它包含了哈希表的具体实现细节,如存储桶(buckets)、哈希函数、冲突解决策略base: base::HashSet<T, S>,
}

方法

with_capacity:创建一个具有指定初始容量的HashSet,可以预先分配足够的空间,避免在插入元素时频繁重新分配内存

use std::collections::HashSet;
fn main() {let hash_set: HashSet<u8> = HashSet::with_capacity(20);println!("{}", hash_set.capacity())// 28
}

capacity:返回HashSet当前的容量,即它可以容纳的元素数量,不包括已经被占用的空间用于处理哈希冲突等情况

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::with_capacity(5);hash_set.insert(1);hash_set.insert(2);println!("Capacity: {}", hash_set.capacity());// Capacity: 7
}

iter:返回一个不可变迭代器,用于遍历HashSet中的元素。元素的顺序是由哈希值和哈希表的内部结构决定的,不是按照插入顺序

use std::collections::HashSet;
fn main() {let hash_set = HashSet::from([1, 2, 3]);for element in hash_set.iter() {println!("{}", element);}// 3// 1// 2
}

len:返回HashSet中元素的数量

use std::collections::HashSet;
fn main() {let hash_set = HashSet::from([1, 2, 3]);println!("Length: {}", hash_set.len());// Length: 3
}

is_empty:判断HashSet是否为空

use std::collections::HashSet;
fn main() {let hash_set: HashSet<i32> = HashSet::new();println!("Is empty? {}", hash_set.is_empty());// Is empty? truelet non_empty_set = HashSet::from([1]);println!("Is non - empty set empty? {}", non_empty_set.is_empty());// s non - empty set empty? false
}

drain:移除HashSet中的所有元素,并返回一个迭代器,允许在移除元素的同时对其进行处理

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::from([1, 2, 3]);let drained: HashSet<i32> = hash_set.drain().collect();println!("Drained set: {:?}", drained);// Drained set: {1, 2, 3}println!("Original set after drain: {:?}", hash_set);// Original set after drain: {}
}

retain:保留满足给定谓词的元素,删除不满足的元素

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::from([1, 2, 3, 4, 5]);hash_set.retain(|&x| x % 2 == 0);println!("Retained set: {:?}", hash_set);// Retained set: {4, 2}
}

clear:移除HashSet中的所有元素,使其变为空集

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::from([1, 2, 3]);hash_set.clear();println!("Cleared set: {:?}", hash_set);// Cleared set: {}
}

with_hasher:使用指定的哈希器(hasher)创建一个HashSet。哈希器用于计算元素的哈希值,可以用于自定义哈希策略

use std::collections::HashSet;
use std::hash::RandomState;
fn main() {let s = RandomState::new();let mut set = HashSet::with_hasher(s);set.insert(2);println!("{:?}", set);// {2}
}

with_capacity_and_hasher:同时指定初始容量和哈希器来创建一个HashSet

use std::collections::HashSet;
use std::hash::RandomState;
fn main() {let s = RandomState::new();let set: HashSet<u8> = HashSet::with_capacity_and_hasher(10, s);let hasher: &RandomState = set.hasher();println!("Capacity: {}", set.capacity());// Capacity: 14println!("hasher: {:?}", hasher);// hasher: RandomState { .. }
}

hasher:返回HashSet当前使用的哈希器

use std::collections::HashSet;
fn main() {let hash_set: HashSet<u8> = HashSet::new();let hasher = hash_set.hasher();println!("{:?}", hasher);// RandomState { .. }
}

reserve:增加HashSet的容量,确保它可以容纳至少指定数量的额外元素

use std::collections::HashSet;
fn main() {let mut hash_set: HashSet<u8> = HashSet::new();hash_set.reserve(10);println!("{}", hash_set.capacity());// 14
}

try_reserve:尝试增加HashSet的容量,如果无法增加则返回false。这是一种更安全的容量增加方式,避免可能的内存分配错误

use std::collections::HashSet;
fn main() {let mut hash_set: HashSet<u8> = HashSet::new();if hash_set.try_reserve(10).is_ok() {println!("Reserved successfully");// Reserved successfully} else {println!("Failed to reserve");}println!("Capacity: {}", hash_set.capacity());// 14
}

shrink_to_fit:将HashSet的容量调整为与当前元素数量相匹配,释放多余的内存

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::with_capacity(10);hash_set.insert(1);hash_set.insert(2);println!("{}", hash_set.capacity());// 14hash_set.shrink_to_fit();println!("{}", hash_set.capacity());// 3
}

shrink_to:将HashSet的容量缩减为不超过指定的最小值。如果当前容量小于指定值,则不进行任何操作

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::with_capacity(10);hash_set.insert(1);hash_set.insert(2);println!("{}", hash_set.capacity());// 14hash_set.shrink_to(5);println!("{}", hash_set.capacity());// 7
}

difference:返回一个迭代器,包含在当前HashSet中但不在另一个HashSet中的元素

use std::collections::HashSet;
fn main() {let a = HashSet::from([1, 2, 3]);let b = HashSet::from([4, 2, 3, 4]);for x in a.difference(&b) {println!("{x}"); // 1}// 在a但不在b中的元素let diff: HashSet<_> = a.difference(&b).collect();println!("{:?}", diff);// {1}// 在b但不在a中的元素let diff: HashSet<_> = b.difference(&a).collect();println!("{:?}", diff);// {4}
}

symmetric_difference:返回一个迭代器,包含在当前HashSet或另一个HashSet中,但不同时在两个集合中的元素

use std::collections::HashSet;
fn main() {let a = HashSet::from([1, 2, 3]);let b = HashSet::from([4, 2, 3, 4]);for x in a.symmetric_difference(&b) {println!("{x}"); // 1 4}let diff1: HashSet<_> = a.symmetric_difference(&b).collect();let diff2: HashSet<_> = b.symmetric_difference(&a).collect();println!("diff1: {:?}", diff1);// diff1: {1, 4}println!("diff2: {:?}", diff2);// diff2: {4, 1}
}

intersection:返回一个迭代器,包含同时在当前HashSet和另一个HashSet中的元素,即交集

use std::collections::HashSet;
fn main() {let a = HashSet::from([1, 2, 3]);let b = HashSet::from([4, 2, 3, 4]);for x in a.intersection(&b) {println!("{x}"); // 2 3}let intersection: HashSet<_> = a.intersection(&b).collect();println!("{:?}", intersection);// {2, 3}
}

union:返回一个联合迭代器,包含在当前HashSet或另一个HashSet中的所有元素

use std::collections::HashSet;
fn main() {let a = HashSet::from([1, 2, 3]);let b = HashSet::from([4, 2, 3, 4]);for x in a.union(&b) {println!("{x}"); // 1 2 3 4}let union: HashSet<_> = a.union(&b).collect();println!("Union: {:?}", union);// Union: {1, 2, 3, 4}
}

contains:检查HashSet是否包含指定的元素

use std::collections::HashSet;
fn main() {let hash_set = HashSet::from([1, 2, 3]);println!("Contains 2? {}", hash_set.contains(&2));// Contains 2? true
}

get:返回一个指向HashSet中指定元素的引用,如果元素不存在则返回None

use std::collections::HashSet;
fn main() {let hash_set = HashSet::from([1, 2, 3]);if let Some(element) = hash_set.get(&2) {println!("Element found: {}", element);// Element found: 2}
}

is_disjoint:检查当前HashSet与另一个HashSet是否没有共同的元素

use std::collections::HashSet;
fn main() {let set1 = HashSet::from([1, 2, 3]);let set2 = HashSet::from([4, 5, 6]);println!("Is disjoint? {}", set1.is_disjoint(&set2));// Is disjoint? true
}

is_subset::检查当前HashSet是否是另一个HashSet的子集,即当前集合中的所有元素都在另一个集合中

use std::collections::HashSet;
fn main() {let set1 = HashSet::from([1, 2]);let set2 = HashSet::from([1, 2, 3]);println!("Is subset? {}", set1.is_subset(&set2));// Is subset? true
}

is_superset:检查当前HashSet是否是另一个HashSet的超集,即另一个集合中的所有元素都在当前集合中

use std::collections::HashSet;
fn main() {let set1 = HashSet::from([1, 2, 3]);let set2 = HashSet::from([1, 2]);println!("Is superset? {}", set1.is_superset(&set2));// Is superset? true
}

insert:向HashSet中插入一个元素。如果元素已经存在,则不进行任何操作

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::new();hash_set.insert(1);println!("{:?}", hash_set);// {1}
}

replace:向HashSet中插入一个元素,替换掉已有的相同元素。如果元素不存在,则插入新元素

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::from([1]);hash_set.replace(2);println!("Replaced set: {:?}", hash_set);// Replaced set: {2, 1}
}

remove:从HashSet中移除指定的元素。如果元素不存在,则不进行任何操作

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::from([1, 2, 3]);hash_set.remove(&2);println!("Removed set: {:?}", hash_set);// Removed set: {1, 3}
}

take:从HashSet中移除并返回指定的元素,如果元素不存在则返回None

use std::collections::HashSet;
fn main() {let mut hash_set = HashSet::from([1, 2, 3]);if let Some(element) = hash_set.take(&2) {println!("Taken element: {}", element);// Taken element: 2}println!("Set after take: {:?}", hash_set);// Set after take: {1, 3}
}

相关文章:

详解Rust标准库:HashSet

## 查看本地官方文档安装rust后运行 rustup doc查看The Standard Library即可获取标准库内容 std::collections::hash_set::HashSet定义 HashSet是一种集合数据结构&#xff0c;它只存储唯一的元素。它主要用于检查元素是否存在于集合中&#xff0c;或者对元素进行去重操作&…...

记录学习react的一些内容

由于是在公司实际项目中学习&#xff0c;所以不是很完整 需要一点一点的学 1.React.useState 类似于vue中的ref 可以修改状态 但是是异步的 感觉不好用 const [wishData, setWishData] React.useState<any>(null); 只能使用setxxx来修改 2.useEffect(()>{},[]) 类…...

json绘制热力图

首先需要一段热力信息的json&#xff0c;我放在头部了。 然后就是需要de-geo库了。 实现代码如下&#xff1a; import * as d3geo from d3-geoimport trafficJSON from ../assets/json/traffic.jsonlet geoFun;// 地理投影函数// let info {max: Number.MIN_SAFE_INTEGER,mi…...

linux 下查看程序启动的目录

以azkaban为例 第一步、ps -ef | grep azkaban 查询出进程号 第二步、cd /proc/ 第三步 、cd 进程号 第四部 ll 查看详情 查看jar 位置 查看jar 启动命令...

书生浦语第四期基础岛L1G2000-玩转书生「多模态对话」与「AI搜索」产品

文章目录 一、MindSearch二、书生浦语三、书生万象四、进阶任务 一、MindSearch MindSearch 是一个开源的 AI 搜索引擎。它会对你提出的问题进行分析并拆解为数个子问题&#xff0c;在互联网上搜索、总结得到各个子问题的答案&#xff0c;最后通过模型总结得到最终答案。书生浦…...

保护Kubernetes免受威胁:容器安全的有效实践

安全并非“放之四海而皆准”的解决方案&#xff0c;相反地&#xff0c;它更多的是一个范围&#xff0c;受其应用的特定上下文的影响。安全领域的专业人士很少宣称什么产品是完全安全的&#xff0c;但总有方法可以实现更强的安全性。在本文中&#xff0c;我们将介绍各种方法来支…...

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程&#xff0c;越来越多的国企央企开始要求软件产品匹配过程化的要求&#xff0c; 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件&#xff0c; 于是开始了解国产中间件都有哪些厂家 一&#xff1a;国产中间件主要产品及厂商 1 东方通&…...

MFC中Excel的导入以及使用步骤

参考地址 在需要对EXCEL表进行操作的类中添加以下头文件&#xff1a;若出现大量错误将其放入stdafx.h中 #include "resource.h" // 主符号 #include "CWorkbook.h" //单个工作簿 #include "CRange.h" //区域类&#xff0c;对Excel大…...

AWS S3在客户端应用不能使用aws-sdk场景下的文件上传与下载

简介 通常情况下&#xff0c;应用程序上传文件到AWS S3&#xff0c;会使用aws-sdk&#xff0c;但是有些情况下&#xff0c;客户端应用会有安装限制&#xff0c;比如不能安装aws-sdk&#xff0c;此时我们就需要通过其他方式实现文件上传与下载。 这里我们提供一个服务端&#…...

深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解

前面我们已经通过三篇文章&#xff0c;详细介绍了 Qwen2.5 大语言模型在 Transformers 框架中的技术细节&#xff0c;包括包和对象加载、模型初始化和分词器技术细节&#xff1a; 深入解析 Transformers 框架&#xff08;一&#xff09;&#xff1a;包和对象加载中的设计巧思与…...

【Python-AI篇】K近邻算法(KNN)

0. 前置----机器学习流程 获取数据集数据基本处理特征工程机器学习模型评估在线服务 1. KNN算法概念 如果一个样本在特征空间中的K个最相似&#xff08;即特征空间中最邻近&#xff09;的样本中大多数属于某一个类别&#xff0c;则该样本也属于这一个类别 1.1 KNN算法流程总…...

aws xray如何实现应用log和trace的关联关系

参考资料 https://community.aws/tutorials/solving-problems-you-cant-see-using-aws-x-ray-and-cloudwatch-for-user-level-observability-in-your-serverless-microservices-applicationshttps://stackoverflow.com/questions/76000811/search-cloudwatch-logs-for-aws-xra…...

centos服务器登录失败次数设定

实现的效果 一台centos服务&#xff0c;如果被别人暴力或者登录次数超过多少次&#xff0c;就拒绝或者在规定时间内拒绝ip登录。这里使用的是fail2ban 安装fail2ban sudo yum install epel-release -y # 先安装 EPEL 源 sudo yum install fail2ban -y配置fail2ban # 复制默…...

实时高效,全面测评快递100API的物流查询功能

一、引言 你是否曾经在网购后焦急地等待包裹&#xff0c;频繁地手动刷新订单页面以获取最新的物流信息&#xff1f;或者作为一名开发者&#xff0c;正在为如何在自己的应用程序中高效地实现物流查询功能而发愁&#xff1f;其实&#xff0c;有一个非常好用的解决方案——快递10…...

第14张 GROUP BY 分组

一、分组功能介绍 使用group by关键字通过某个字段进行分组&#xff0c;对分完组的数据分别 “SELECT 聚合函数”查询结果。 1.1 语法 SELECT column, group_function(column) FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column]; 明确&#…...

笔记整理—linux驱动开发部分(10)input子系统与相关框架

关于输入类设备的系统有touch、按键、鼠标等&#xff0c;在系统中&#xff0c;命令行也是输入类系统。但是GUI的引入&#xff0c;不同输入类设备数量不断提升&#xff0c;带来麻烦&#xff0c;所以出现了struct input_event。 struct input_event {struct timeval time;//内核…...

[算法初阶]埃氏筛法与欧拉筛

素数的定义&#xff1a; 首先我们明白&#xff1a;素数的定义是只能整除1和本身&#xff08;1不是素数&#xff09;。 我们判断一个数n是不是素数时&#xff0c;可以采用试除法&#xff0c;即从i2开始&#xff0c;一直让n去%i&#xff0c;直到i*i<n c语言: #include<…...

【THM】linux取证 DisGruntled

目录 0x00 房间介绍 0x01 连接并简单排查 0x02 让我们看看做没做坏事 0x03 炸弹已埋下。但何时何地&#xff1f; 0x04 收尾 0x05 结论 0x00 房间介绍 嘿&#xff0c;孩子&#xff01;太好了&#xff0c;你来了&#xff01; 不知道您是否看过这则新闻&#xff0c;我…...

SpringBoot整合Freemarker(四)

escape, noescape 语法 <#escape identifier as expression>...<#noescape>...</#noescape>... </#escape> 用例 主要使用在相似的字符串变量输出&#xff0c;比如某一个模块的所有字符串输出都必须是html安全的&#xff0c;这个时候就可以使用&am…...

centos docker 安装 rabbitmq

安装docker 1.更新现有的软件包 首先&#xff0c;确保您的系统是最新的&#xff0c;可以通过运行以下命令来实现&#xff1a; sudo yum update -y 2.移除旧版本的Docker 如果您之前安装过Docker&#xff0c;可能需要先卸载旧版本。使用以下命令来卸载旧版本的Docker&#…...

手动实现promise的all,race,finally方法

Promise.all 是一个非常有用的工具&#xff0c;它接受一个 Promise 对象数组&#xff0c;并返回一个新的 Promise。当所有输入的 Promise 都成功解决时&#xff0c;新的 Promise 会解决为一个包含所有结果的数组&#xff1b;如果任何一个 Promise 被拒绝&#xff0c;新的 Prom…...

H5移动端预览PDF方法

新建页面 新建一个页面以便去预览对应的pdf 新建完后在 pages.json 文件内去新增对应路由 页面内容 <template><view class"page"><view class"pdf"><view id"demo"></view></view><view class"b…...

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…...

《潜行者2切尔诺贝利之心》游戏引擎介绍

潜行者2切尔诺贝利之心是基于虚幻5引擎&#xff0c;所以画面效果大家不必担心。游戏目前已经跳票了很久&#xff0c;预计发售时间是2024 年 11 月 21 日&#xff0c;这次应该不会再跳票。 潜行者2切尔诺贝利之心是虚幻5吗 答&#xff1a;是虚幻5。 潜行者官方推特之前回复了…...

winform 加载 office excel 插入QRCode图片如何设定位置

需求&#xff1a;winform 加载 office excel 并加载QRCode图片&#xff0c;但是每台PC打印出来QRCode位置都不太一样&#xff0c;怎么办呢&#xff1f; 我的办法&#xff1a; 1、在sheet中插入一个 textbox &#xff0c;改名 qrcode &#xff08;这个名字随便设置&#xff09…...

简易入手《SOM神经网络》的本质与原理

原创文章&#xff0c;转载请说明来自《老饼讲解神经网络》:www.bbbdata.com 关于《老饼讲解神经网络》&#xff1a; 本网结构化讲解神经网络的知识&#xff0c;原理和代码。 重现matlab神经网络工具箱的算法&#xff0c;是学习神经网络的好助手。 目录 一、入门原理解说 01.…...

21.assert断言

assert&#xff08;断言&#xff09;主要用于在程序运行过程中检查某个条件是否满足&#xff0c;如果不满足则会触发错误并终止程序执行&#xff0c;可以帮助程序员在开发阶段及时发现可能存在的逻辑错误等问题。 通过断言调试程序&#xff0c;abotr() has been called 就是断言…...

15分钟学 Go 第 46 天 : 监控与日志

第46天&#xff1a;监控与日志 学习目标 了解如何实现应用监控与日志管理&#xff0c;掌握相关工具和最佳实践。 内容结构 引言监控的概念与工具 监控的定义常见监控工具 日志管理的概念与工具 日志的重要性常见日志管理工具 实现监控与日志的最佳实践 监控指标日志格式 实战…...

BFS 算法专题(四):多源 BFS

目录 1. 01 矩阵 1.1 算法原理 1.2 算法代码 2. 飞地的数量 2.1 算法原理 2.2 算法代码 3. 地图中的最高点 3.1 算法原理 3.2 算法代码 4. 地图分析 4.1 算法原理 4.2 算法代码 1. 01 矩阵 . - 力扣&#xff08;LeetCode&#xff09; 1.1 算法原理 采用 BFS 正难…...

基于Spring Boot+Vue的养老院管理系统【原创】

一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;ElementUI&#xff1b; 开发工具&…...

去哪接单做网站/关键词挖掘工具免费

初学react实现路由跳转This is part of my “React for beginners” series on introducing React, its core features and best practices to follow. More articles are coming!这是我的“初学者React”系列的一部分&#xff0c;该系列介绍了React&#xff0c;其核心功能和可…...

政府网站建设回顾/西安百度快照优化

坑 正交意味着完全的不相关。 相关性刻画的是两个随机变量是否存在线性关系。 独立刻画的是两个变量之间是否存在联系。 X和Y不相关&#xff0c;意味着两者不存在线性关系&#xff0c;但是不能保证也没有非线性的关系。 而 X和Y相互独立&#xff0c;意味着两者不仅没有线性关…...

网站建设多少钱/东莞网站营销推广

ubuntu安装pycharm的方法如下所示&#xff1a;1. 下载选择Linux Tab&#xff0c;选择下载免费的Community Edition.2. 安装PyCharm按照官网给出的安装指导【2】进行安装。(1) Copy the pycharm-*.tar.gz to the desired installation location (make sure you have rw permissi…...

哈尔滨发布最新公告/路由器优化大师

www.jn.zk.netZK开源Ajax Mobile Java框架的5.0.5版现已发布。 这是一个维护版本&#xff0c;具有针对ZK组件的改进功能和错误修复。 它将客户端引擎升级到jQuery 1.4.3版&#xff0c;并增强了列表框&#xff0c;树和布局组件。 5.0.5版带有一个新的LabelLocator接口&#xff…...

做微信的网站秀客/简单的个人网页制作html

关于微信小程序request 请求接口的封装&#xff0c;在此记录一下。 封装如下&#xff1a;utils.js 文件 /*** 获取header*/ function getCommonHeader() {let header {Content-type: application/x-www-form-urlencoded};// 如果token有值则带上let token wx.getStorageSyn…...

做网站联系我们模板免费/怎么自己创建网站

今天这里贴出从应用层传出一个id或图片byte[]数组&#xff0c;通过aidl与service交互调用JNI&#xff0c;最后到Cursor.c实现画不同状态的光标。下面就给出Cursor.c的实现画图&#xff0c;前面的过程就不全给出了&#xff1a;Cursor.c#include #include #include #include #inc…...