Rust 从入门到精通12-集合
Rust 标准库中还提供了一系列被称为 集合(collections)的数据结构,类似于JDK中 java.util
包下面的一些集合类(List/Set/Map等),这类集合指向的数据是存储在堆上,意味着数据的数量不必在编译期就已知,并且还能随着程序的运行增大或缩小,每种集合都有其适用的场景,在我们日常开发过程中是非常有用的。
1、Vector
1.1 作用
由标准库提供,用来存储多个相同类型的值,其值在内存中是连续存放的。
相关 api 介绍:https://doc.rust-lang.org/std/vec/struct.Vec.html
1.2 创建
①、Vec::new 函数
fn main() {let v: Vec<i32> = Vec::new();
}
因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素,所以无法进行类型推断,这里我们就增加了泛型<i32>
,表示这个集合 v 只能存放 i32
类型的数据。
②、vec![] 宏
fn main() {let v = vec![1, 2, 3];
}
这里我们提供了 i32
类型的初始值,Rust 可以推断出 v
的类型是 Vec<i32>
,因此不需要加上泛型注解。
1.3 添加
fn main() {let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2);
}
通过 push() 向集合末尾添加元素,注意要声明为 mut
使其可变。
1.4 修改
直接通过下标的方式修改:
fn main() {let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2);v[0] = 3;
}
1.5 删除
①、通过下标删除
fn main() {let mut v: Vec<i32> = Vec::new();v.push(1);v.push(2);v.remove(0);
}
②、删除末尾元素
v.pop();
1.6 遍历
fn main() {let mut v: Vec<i32> = vec![1,2,3,4];// 遍历引用地址for x in &v{print!("{} ", x);}// 遍历下标for x in 0..v.len(){if let Some(num) = v.get(x) {print!("{} ", num);}}for x in v.iter() {print!("{} ", x);}for x in v.into_iter() {print!("{} ", x);}
}
1.7 遍历修改
fn main() {let mut v: Vec<i32> = vec![1,2,3,4];for x in &mut v {*x += 1;}println!("&mut v {:?}", v);for x in v.iter_mut() {*x += 1;}println!("v.iter_mut {:?}", v);for x in 0..v.len() {if let Some(num) = v.get_mut(x) {*num += 1;}}println!("0..v.len() get_mut {:?}", v);let v1: Vec<i32> = v.iter().map(|x| x + 1).collect();println!("v.iter().map().collect() {:?}", v1);}
1.8 使用枚举存储不同类型
前面我们说vector 只能储存相同类型的值,但实际会有很多情况下我们要存储不同类型的值,这时候就可以使用枚举。
因为枚举成员都被定义为相同的枚举类型。
fn main() {let row = vec![SpreadsheetCell::Int(3),SpreadsheetCell::Text(String::from("blue")),SpreadsheetCell::Float(10.12),];
}enum SpreadsheetCell {Int(i32),Float(f64),Text(String),
}
2、HashMap
2.1 作用
基于 hash 算法的存储一组键值对 (key- value- pair) 的容器,可以通过 K(任意类型)来寻找数据,而不是通过索引。
2.2 创建
注意必须首先通过 use
引用标准库中集合部分的 HashMap
。HashMap
没有被 prelude 自动引用。
标准库中对 HashMap
的支持也相对较少,例如,并没有内建的构建宏。
use std::collections::HashMap;
let mut map = HashMap::new();
PS:注意上面不指明 map 的类型,编译是会报错的。要么指明编译类型 let mut map: HashMap<String,i32> = HashMap::new()
;要么通过类型推断,像 map 中添加数据。
2.3 添加
fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"), 50);
}
像 vector 一样,哈希 map 将它们的数据储存在堆上,这个 HashMap
的键类型是 String
而值类型是 i32
。
类似于 vector,哈希 map 是同质的:所有的键必须是相同类型,值也必须都是相同类型。
2.4 修改
①、覆盖一个值
用相同的键插入一个不同的值,也就是连续调用两次 insert ,其 key 相同,value 不同。
fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Blue"), 50);println!("{:?}", scores);//{"Blue": 50}
}
②、key 不存在则插入,存在就不做操作
fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.entry(String::from("Yellow")).or_insert(50);scores.entry(String::from("Blue")).or_insert(50);println!("{:?}", scores);//{"Blue": 10, "Yellow": 50}
}
Entry
的 or_insert
方法在键对应的值存在时就返回这个值的可变引用,如果不存在则将参数作为新值插入并返回新值的可变引用。
③、key 不存在则插入,存在做更新操作
fn main() {use std::collections::HashMap;let text = "hello world wonderful world";let mut map = HashMap::new();for word in text.split_whitespace() {let count = map.entry(word).or_insert(0);*count += 1;}println!("{:?}", map);
}
打印结果:
{“world”: 2, “hello”: 1, “wonderful”: 1}
由于Entry
的 or_insert
方法在键对应的值存在时会返回这个值的可变引用,我们通过 *
解引用然后去修改里面的值。
2.5 删除
fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"),50);scores.remove(&String::from("Yellow"));println!("{:?}", scores);//{"Blue": 10}
}
2.6 遍历
fn main() {let mut scores = HashMap::new();scores.insert(String::from("Blue"), 10);scores.insert(String::from("Yellow"),50);println!("{:?}", scores);//{"Blue": 10}for (key, value) in &scores {println!("{}: {}", key, value);}
}
Rust 从入门到精通12-集合相关推荐
- ChatGPT 从入门到精通12:教你如何用AI 五分钟做出一个高大上的PPT
ChatGPT狂飙160天,世界已经不是之前的样子. 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 这是<ChatGPT ,从 ...
- Rust 从入门到精通01-简介
1.rust 从哪里来? Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目.第一个有版本号的 Rus ...
- 《Java零基础入门到精通(集合,泛型,IO,反射,JVM, 源码)【渡一教育】》思维导图版笔记(完结)
所有思维导图的xind和png文件都可以点击下面链接去下载: 链接: https://pan.baidu.com/s/1RHBHgyHY6TZqWQ_HIO8Wew 提取码: jxrd 复制这段内容后 ...
- Rust 从入门到精通10-所有权
在介绍rust 所有权时,我们先介绍内存管理的一些基础概念. 1.堆和栈 一个进程在执行的时候,它所占用的内存虚拟空间一般被分割为好几个区域,我们称为"段"(Segment).常见 ...
- rust原地复活_rust腐蚀游戏新手入门必知小技巧 Rust腐蚀游戏中的12个实用小技巧...
rust腐蚀游戏新手入门必知小技巧,想必还有很多小伙伴还不太了解,下面小编给大家带来了Rust腐蚀游戏中的12个实用小技巧,一起来看看吧. rust腐蚀游戏新手入门必知小技巧 Rust腐蚀游戏中的12 ...
- 12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法
12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法 Python字典 创建空字典 访问字典里的值 修改字典 删除字典元素 字典键的特性 ...
- 视频教程-赵强老师:大数据从入门到精通(12)集群HA-Hadoop
赵强老师:大数据从入门到精通(12)集群HA 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblogic)和大数据Hadoo ...
- 《AutoCAD 2016中文版室内装潢设计从入门到精通》——第2章 AutoCAD 2016入门2.1 操作界面...
本节书摘来自异步社区<AutoCAD 2016中文版室内装潢设计从入门到精通>一书中的第2章,第2.1节,作者: 贾燕 更多章节内容可以访问云栖社区"异步社区"公众号查 ...
- 【翻译】WF从入门到精通(第十一章):并行活动
上一篇:[翻译]WF从入门到精通(第十章):事件活动 学习完本章,你将掌握: 1.理解在工作流环境中Parallel活动是怎样执行的,并且懂得如何使用它们 2.并行执行路径中的同步数据 ...
- python从入门到精通视频(全60集)-【网盘下载】Python从入门到精通视频(全60集)...
Python从入门到精通视频(全60集) JAVA? 今天 课程目录 python入门教程-1-Python编程语言历史及特性 python入门教程-2-Python编程语言初接触 python入门教 ...
最新文章
- 【组合数学】递推方程 ( 通解定义 | 无重根下递推方程通解结构定理 )
- 链表的有序集合_JAVA
- jquery ajax的post、get方式
- 网络安全第一讲 计算机网络安全概述
- Java笔记-多线程中同步加锁相关
- 带你掌握二进制SCA检测工具的短板及应对措施
- Atititcmd cli环境变量的调用设置与使用
- adblock插件_为WordPress创建一个反AdBlock插件
- LoRaWAN协议格式
- 逆战ds服务器怎么修复,IBMDS3512存储硬盘坏了正确的更换方法应该是怎么
- phpstudy本地快速搭建网站,并外网访问【无公网IP】
- 去水印小程序源码 独立版
- 【解题报告】Kattis - adjoin 树形dp
- phpstorm的使用方法
- 本机电脑清除DNS缓存+浏览器清除DNS缓存
- linux定时压缩脚本,使用shell脚本对日志文件进行定时压缩
- 阿里云深度学习平台试玩
- 程序员从来没给丈母娘买礼物,真相竟然令人沉默
- 这个年代,你还不知道的小白用卡攻略!!!
- 《论文写作》课堂收获