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

【Rust语言】std::collections::HashMap用法

HashMap用法文档

文章目录

  • 创建
      • 键的要求
  • 增删改查
      • 增: insert
      • 删: remove/remove_entry
          • 单点修改 get_mut
          • 整体修改 values_mut/iter_mut
      • 集增改于一身的entry
  • 遍历
      • 只读遍历
      • into_values() 与 into_keys()
      • 容量、实际长度、判空
      • 导出
      • 清除
      • 重定容量

use std::collections::HashMap;

创建

// 最简单的写法
let mut my_map = HashMap::new();// 写全了就是 ↓
let mut map: HashMap<&str, i32> = HashMap::new();// 规定初始容量
let mut map: HashMap<&str, i32> = HashMap::with_capacity(10);// 创建一个使用随机哈希器的 HashMap
use std::hash::RandomState;
let s = RandomState::new();
let mut map = HashMap::with_hasher(s);// 使用随机哈希器 并且规定初始容量
let mut map = HashMap::with_capacity_and_hasher(10, s);

键的要求

键需要实现 Eq 和 Hash 特征,通常可以使用默认
#[derive(Partial Eq, Eq, Hash)]
如果您自己实现这些属性,则以下属性必须成立:
k1 == k2 -> hash(k1) == hash(k2)

增删改查

增: insert

将键值对插入到映射中。

如果映射不存在此键,则返回 None。

如果映射确实存在此键,则更新该值并返回旧值。

my_map.insert("Daniel", "798-1364");

删: remove/remove_entry

map.remove(&1)
map.remove_entry(&1);
返回Option,若map中有key==1的,则返回Some((1, “a”), 否则返回None

单点修改 get_mut

返回对与 key 对应的值的可变引用。

键可以是映射的键类型的任何借用形式,但借用形式的 Hash 和 Eq 必须与键类型的 Hash 和 Eq 匹配。

// if let 的用法:返回None,则 if语句中不执行(不会报错)
if let Some(x) = map.get_mut(&1) {*x = "b";
}
整体修改 values_mut/iter_mut
for (_, val) in map.iter_mut() {*val *= 2;
}for val in map.values_mut() {*val = *val + 10;
}

思考:为什么没有key_mut?
答:因为hash map中的key不可改

assert_eq!(map.contains_key(&1), true);// 返回bool类型
map.get_key_value(&1); //返回Option<(&K, &V)类型
map.get(&1)// 返回Option<&V>类型

集增改于一身的entry

letters.entry(ch).and_modify(|counter| *counter += 1).or_insert(1);

解释:

letters.entry(ch):

letters 是一个 HashMap,其中 entry 方法被调用。这个方法接受一个键(在这个例子中是 ch),并返回一个 Entry 类型的值,代表映射中与该键关联的值的入口点。

Entry API 提供了一种方式来迭代、插入或修改映射中的值,而不需要直接使用 get、insert 或 get_mut 方法。

.and_modify(|counter| *counter += 1):

and_modify 方法是一个在 Entry API 中使用的方法,它用于修改已存在的值。如果键 ch 已经存在于映射中,这个方法将被调用。

它接受一个闭包 |counter| *counter += 1,这个闭包接受一个可变引用 counter 到当前的计数值,并递增这个值。这里 *counter += 1 相当于 counter = counter + 1,但使用了解引用操作符 * 来修改值。

.or_insert(1):

or_insert 方法是 Entry API 的一部分,用于处理键不存在的情况。如果 ch 不在映射中,这个方法将被调用。

它接受一个值(在这个例子中是 1),并将这个值插入到映射中作为 ch 的值。如果 ch 已经存在,这个方法不会做任何事情。

综合来看,这行代码的作用是:

  • 如果 ch 已经作为键存在于 letters 映射中,就将其对应的值增加 1。

  • 如果 ch 不存在,就在映射中插入 ch 作为键,并将其值初始化为 1。

这种写法非常适合于计数场景,如统计字符出现的次数,因为它简洁地处理了值的更新和插入。

遍历

只读遍历

// 遍历key
for key in map.keys() {println!("{key}");
}// 遍历value
for val in map.values() {println!("{val}");
}// 遍历键值对
for (key, val) in map.iter() {println!("key: {key} val: {val}");
}

into_values() 与 into_keys()

// 可改,但执行完,map就没了,它的所有值已经被移动到迭代器中。开销大,一般不这么用。
// value拥有所有权
for value in map.into_values() {println!("{}", value);
}// 常见用法,效果是把所有的val/key放入Vec中。
let mut vec: Vec<i32> = map.into_values().collect();
let mut vec: Vec<&str> = map.into_keys().collect();vec.sort_unstable(); //排序

注意:遍历的复杂度是O(capacity),而非O(len)

容量、实际长度、判空

assert!(map.capacity() >= 100);
assert_eq!(a.len(), 0);
assert!(!a.is_empty());

导出

for (k, v) in a.drain().take(1) {assert!(k == 1 || k == 2);assert!(v == "a" || v == "b");
}

清除

map.clear();

重定容量

// 容量至少增加10
map.reserve(10);// 尝试容量至少增加10
map.try_reserve(10).expect("why is the test harness OOMing on a handful of bytes?");// 缩小容量至合适大小
map.shrink_to_fit();// 缩小至(如果参数比len还小,则该句话被忽略)
map.shrink_to(10);

相关文章:

【Rust语言】std::collections::HashMap用法

HashMap用法文档 文章目录 创建键的要求 增删改查增: insert删: remove/remove_entry改单点修改 get_mut整体修改 values_mut/iter_mut 查集增改于一身的entry 遍历只读遍历into_values() 与 into_keys()容量、实际长度、判空导出清除重定容量 use std::collections::HashMap;创…...

使用SoapUI、Postman工具调用Webservice方法

SoapUI工具更适合调用Webservice使用。 1.使用SoapUI工具调用Webservice 创建“New SOAP Project” 自行定义一个项目名称&#xff0c;输入wsdl地址&#xff1a; 在左侧列表找到方法名&#xff0c;双击“Request 1”, 在请求数据中&#xff0c;添加对应的参数&#xff0c;然…...

js 与 C++引用和指针的关系

js 与 C引用和指针的关系 js 中既有引用的影子, 也有指针的影子。 1、引用用法 这里相当于C 中的引用, b是a的引用, 修改b ,a也改变。 var a { 1: 1 }var b a;a null;b[2] 2;console.error(b); // { 1: 1, 2: 2 }2、指针用法 这里 a,b应该按照指针理解。 var a undef…...

python --PyAibote自动化

官文: https://www.pyaibote.com/ 下载安卓集成环境: 可以看到开发的一些信息...

Ubuntu系统开发环境搭建

一&#xff0c;Android源码编译环境搭建 1 安装Java Development Kit (JDK) sudo apt-get update sudo apt-get install openjdk-8-jdk 2,确认JDK安装成功 java -version 3,安装编译所需的依赖项 sudo apt-get install git-core gnupg flex bison gperf build-essential zip cu…...

lvs-dr模式实验详解

华子目录 lvs-dr&#xff08;企业当中最常用&#xff09;dr模式数据逻辑dr模式数据传输过程dr模式的特点实验拓扑实验主机准备解决vip响应问题限制响应级别:arp_ignore限制通告级别:arp_announce 实验步骤1.client的ip设定2.router上的ip设定3.router开启路由转发功能4.lvs主机…...

【RDMA】mlxconfig修改和查询网卡(固件)配置--驱动工具

目录 简介 工具要求 语法 例子和参数 例子 更多参数 其他工具和查询 简介 mlxconfig 工具允许用户在不重新烧录固件的情况下更改某些设备配置。 配置在重启后仍然保留。 默认情况下&#xff0c;mlxconfig 显示将在下次启动时加载的配置。对于第五代设备&#xff0c;还…...

跨站请求伪造(CSRF)漏洞详解

免责申明 本文仅是用于学习检测自己搭建的DVWA靶场环境有关CSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法…...

Java+Spring Cloud +UniApp 智慧工地源码,用户PC端、移动端数据同步,支持多端展示

数字化给各行各业所带来的改变&#xff0c;在早些年间突出自动这一流程。但随着科技的发展&#xff0c;让人们也愈发了解可视化操作所带来的优势。智慧工地的诞生&#xff0c;相当于为建筑施工带来了一套较为完整的数字化流程&#xff0c;能够完善施工环节中的各部分内容。接下…...

【推广】图书|2024新书《大模型RAG实战:RAG原理、应用与系统构建》汪鹏、谷清水、卞龙鹏等,机械工业出版社

探索RAG系统新高度&#xff1a;《大模型RAG实战&#xff1a;RAG原理、应用与系统构建》 随着大模型技术的爆发&#xff0c;尤其是ChatGPT之后&#xff0c;以ChatPDF为首的知识库问答产品迅速走红&#xff0c;引发了RAG&#xff08;检索增强生成&#xff09;系统的广泛关注与讨论…...

在Unity UI中实现UILineRenderer组件绘制线条

背景介绍 在Unity的UI系统中&#xff0c;绘制线条并不像在3D世界中那样直观(使用Unity自带的LineRender组件在UI中连线并不方便,它在三维中更合适)。没有内置的工具来处理这种需求。如果你希望在UI元素之间绘制连接线&#xff08;例如在UI上连接不同的图标或控件&#xff09;&a…...

C语言中union的用法

在C语言中&#xff0c;union&#xff08;联合体&#xff09;是一种特殊的复合数据类型&#xff0c;它允许多个不同的数据成员共享同一块内存空间。与struct&#xff08;结构体&#xff09;不同的是&#xff0c;union中的所有成员共用同一个内存地址&#xff0c;因此同时只能存储…...

C++速通LeetCode中等第18题-删除链表的倒数第N个结点(最简单含注释)

绝妙&#xff01;快慢指针法,快指针先走n步&#xff08;复杂度O(n),O(1))&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(n…...

鸿蒙 WebView 设置 Header

import { webview } from kit.ArkWebimport { WebHeader } from kit.ArkUI 一共两种方式&#xff1a; 1.把 loadurl的方法写在web组件的生命周期里面 Web({ src:"", controller: this.controller }) .onControllerAttached(()>{ this.controller.loadUrl("…...

电力施工作业安全行为检测图像数据集

电力施工作业安全行为检测图像数据集&#xff0c;图片总共 2300左右&#xff0c;标注为voc(xml)格式&#xff0c;包含高空抛物&#xff0c;未佩戴安全带&#xff0c;高处作业无人监护等。 电力施工作业安全行为检测图像数据集 数据集描述 这是一个专门用于电力施工作业安全行…...

大数据实验2.Hadoop 集群搭建(单机/伪分布式/分布式)

实验二&#xff1a; Hadoop安装和使用 一、实验目的 实现hadoop的环境搭建和安装Hadoop的简单使用&#xff1b; 二、实验平台 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04或者18.04&#xff09;&#xff1b;Hadoop版本&#xff1a;3.1.3&#xff1b;JDK版本&…...

【CSS in Depth 2 精译_036】5.6 Grid 网格布局中与对齐相关的属性 + 5.7本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…...

Qt圆角窗口

Qt圆角窗口 问题&#xff1a;自己重写了一个窗口&#xff0c;发现用qss设置圆角了&#xff0c;但是都不生效&#xff0c;不过子窗口圆角都生效了。 无边框移动窗口 bool eventFilter(QObject *watched, QEvent *evt) {static QPoint mousePoint;static bool mousePressed f…...

研究生第一次刷力扣day1

1.给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值target 的那两个整数&#xff0c;并返回它们的数组下标 直接采用暴力求解&#xff0c;其他解答案看不懂 大致思想&#xff1a;先用len函数求出数组的长度n&#xff0c;然后一个个遍…...

flink自定义process,使用状态求历史总和(scala)

es idea maven 依赖 <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-elasticsearch7_2.11</artifactId> <version>1.11.1</version> </dependency> import org.apache.flink.api.common.eve…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...