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

Rust 语言的 HashMap

HashMap 在 Rust 中是一个非常常用且强大的数据结构,它允许你存储键值对(key-value pairs),并且能够快速地基于键检索值。

下面是使用 HashMap 的一些基本示例:

首先,你需要在你的文件中引入 HashMap

use std::collections::HashMap;

创建一个新的 HashMap

let mut map = HashMap::new();

插入元素

使用 insert 方法插入元素:

map.insert(String::from("key1"), 1);
map.insert(String::from("key2"), 2);
map.insert(String::from("key3"), 3);

注意,在上述例子中,键是 String 类型,值是 i32 类型。在实际使用中,你可以使用任何实现了适当 trait(例如 EqHash 对于键)的类型。

检索元素

使用 get 方法检索元素:

let value = map.get(&String::from("key1"));
match value {Some(v) => println!("Found value: {}", v),None => println!("No value found"),
}

或者更简洁地,使用 if let 语法:

if let Some(v) = map.get(&String::from("key1")) {println!("Found value: {}", v);
} else {println!("No value found");
}

遍历 HashMap

你可以使用 for 循环遍历 HashMap 中的键值对:

for (key, value) in &map {println!("{}: {}", key, value);
}

更新 HashMap 中的值

如果键已经存在,insert 方法会覆盖旧的值。如果你只想在键不存在时插入新值,可以使用 entry 方法:

match map.entry(String::from("key1")) {std::collections::hash_map::Entry::Occupied(mut entry) => {// 修改现有值*entry.get_mut() = 4;},std::collections::hash_map::Entry::Vacant(entry) => {// 插入新值entry.insert(1);},
}

或者使用更简洁的 or_insert 方法:

*map.entry(String::from("key1")).or_insert(1) = 4; // 如果 "key1" 存在,将其值设置为 4;否则,插入 (key1, 1) 但随后立即将其值更改为 4(这可能不是你想要的,因此请谨慎使用此简洁形式)。

通常你可能想要这样做:

if !map.contains_key(&String::from("key1")) {map.insert(String::from("key1"), 1);
} else {// 如果需要的话,处理已经存在键的情况。
}

或者,更优雅地使用 entry 方法:

map.entry(String::from("key1")).or_insert_with(|| {// 仅在键不存在时计算并插入新值。这里的闭包返回要插入的值。1 // 例如,这里返回1作为新值。实际上,你可以执行任何复杂的计算或逻辑来生成这个值。
});

在这个例子中,or_insert_with 方法允许你指定一个闭包,该闭包在键不存在时被调用以生成要插入的值。这对于需要复杂计算或避免不必要计算的情况非常有用。如果键已经存在,则不会调用闭包。

http://www.lryc.cn/news/323743.html

相关文章:

  • 【目标检测基础篇】目标检测评价指标:mAP计算的超详细举例分析以及coco数据集标准详解(AP/AP50/APsmall.....))
  • 服务器与普通电脑的区别,普通电脑是否可以作为服务器使用
  • 长安链Docker Java智能合约引擎的架构、应用与规划
  • STM32 ESP8266模块的曲折探索
  • letcode::根据二叉树创建字符串
  • 6个免费的ChatGPT网站
  • 每天几道面试题|Kafka(一)基础概念
  • PLC与智能制造——蛋糕增大?谁来先行?
  • 基于spring boot框架的发艺美发店管理系统
  • Linux - IO
  • Cmake和opencv环境安装
  • Redis是如何避免“数组+链表”的过长问题
  • Grass手机注册使用教程,利用闲置手机WiFi带宽赚钱
  • java NIO群聊系统
  • ZCC5429 异步升压芯片
  • 复试专业前沿问题问答合集10-1——区块链与加密货币
  • redis【面试题】
  • linux下使用 tar 来压缩和解压 tar.gz 和 tar.xz 文件
  • Python环境下基于1D-CNN的轴承故障诊断及TSNE特征可视化
  • 进程的调度,原则,算法
  • 瑞_23种设计模式_状态模式
  • system Verilog:clocking中定义信号为input和output的区别
  • JAVA_Tomcat
  • uniapp运行项目到微信小程序报错——未找到[“sitemapLocation“]
  • pytorch升级打怪(八)
  • 全智能深度演进,一键成片让视频创作颠覆式提效
  • uniapp(vue3) H5页面连接打印机并打印
  • Android视角看鸿蒙第八课(module.json5中的各字段含义之abilities)下
  • 设计模式 适配器模式
  • 前端面试题详解