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 引用标准库中集合部分的 HashMapHashMap 没有被 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}
}

Entryor_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}

由于Entryor_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-集合相关推荐

  1. ChatGPT 从入门到精通12:教你如何用AI 五分钟做出一个高大上的PPT

    ChatGPT狂飙160天,世界已经不是之前的样子. 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 这是<ChatGPT ,从 ...

  2. Rust 从入门到精通01-简介

    1.rust 从哪里来? Rust语言在2006年作为 Mozilla 员工 Graydon Hoare 的私人项目出现,而 Mozilla 于 2009 年开始赞助这个项目.第一个有版本号的 Rus ...

  3. 《Java零基础入门到精通(集合,泛型,IO,反射,JVM, 源码)【渡一教育】》思维导图版笔记(完结)

    所有思维导图的xind和png文件都可以点击下面链接去下载: 链接: https://pan.baidu.com/s/1RHBHgyHY6TZqWQ_HIO8Wew 提取码: jxrd 复制这段内容后 ...

  4. Rust 从入门到精通10-所有权

    在介绍rust 所有权时,我们先介绍内存管理的一些基础概念. 1.堆和栈 一个进程在执行的时候,它所占用的内存虚拟空间一般被分割为好几个区域,我们称为"段"(Segment).常见 ...

  5. rust原地复活_rust腐蚀游戏新手入门必知小技巧 Rust腐蚀游戏中的12个实用小技巧...

    rust腐蚀游戏新手入门必知小技巧,想必还有很多小伙伴还不太了解,下面小编给大家带来了Rust腐蚀游戏中的12个实用小技巧,一起来看看吧. rust腐蚀游戏新手入门必知小技巧 Rust腐蚀游戏中的12 ...

  6. 12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法

    12.从入门到精通:Python字典,创建字典,访问字典的值,修改字典,删除字典,字典键的特性,字典内置函数和方法 Python字典 创建空字典 访问字典里的值 修改字典 删除字典元素 字典键的特性 ...

  7. 视频教程-赵强老师:大数据从入门到精通(12)集群HA-Hadoop

    赵强老师:大数据从入门到精通(12)集群HA 毕业于清华大学,拥有超过13年的工作经验. Oracle认证讲师,拥有6年以上授课经验.精通Oracle数据库.中间(Weblogic)和大数据Hadoo ...

  8. 《AutoCAD 2016中文版室内装潢设计从入门到精通》——第2章 AutoCAD 2016入门2.1 操作界面...

    本节书摘来自异步社区<AutoCAD 2016中文版室内装潢设计从入门到精通>一书中的第2章,第2.1节,作者: 贾燕 更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  9. 【翻译】WF从入门到精通(第十一章):并行活动

    上一篇:[翻译]WF从入门到精通(第十章):事件活动 学习完本章,你将掌握:     1.理解在工作流环境中Parallel活动是怎样执行的,并且懂得如何使用它们     2.并行执行路径中的同步数据 ...

  10. python从入门到精通视频(全60集)-【网盘下载】Python从入门到精通视频(全60集)...

    Python从入门到精通视频(全60集) JAVA? 今天 课程目录 python入门教程-1-Python编程语言历史及特性 python入门教程-2-Python编程语言初接触 python入门教 ...

最新文章

  1. 【组合数学】递推方程 ( 通解定义 | 无重根下递推方程通解结构定理 )
  2. 链表的有序集合_JAVA
  3. jquery ajax的post、get方式
  4. 网络安全第一讲 计算机网络安全概述
  5. Java笔记-多线程中同步加锁相关
  6. 带你掌握二进制SCA检测工具的短板及应对措施
  7. Atititcmd cli环境变量的调用设置与使用
  8. adblock插件_为WordPress创建一个反AdBlock插件
  9. LoRaWAN协议格式
  10. 逆战ds服务器怎么修复,IBMDS3512存储硬盘坏了正确的更换方法应该是怎么
  11. phpstudy本地快速搭建网站,并外网访问【无公网IP】
  12. 去水印小程序源码 独立版
  13. 【解题报告】Kattis - adjoin 树形dp
  14. phpstorm的使用方法
  15. 本机电脑清除DNS缓存+浏览器清除DNS缓存
  16. linux定时压缩脚本,使用shell脚本对日志文件进行定时压缩
  17. 阿里云深度学习平台试玩
  18. 程序员从来没给丈母娘买礼物,真相竟然令人沉默
  19. 这个年代,你还不知道的小白用卡攻略!!!
  20. 《论文写作》课堂收获

热门文章

  1. python乌龟吃鱼_python学习之乌龟吃鱼and思聪吃热狗游戏
  2. 常用图像像素格式 NV12、NV2、I420、YV12、YUYV
  3. 大数据之项目需求及架构设计
  4. html5虚拟摇杆,关于前端:babylonjs-第三方-nipplejs虚拟摇杆
  5. Windows下安装HDFView
  6. MATLAB 绘图函数及绘图辅助
  7. iTEXT常用属性设置
  8. 《手把手教你学DSP》总结1
  9. rfid考勤系统c语言,基于RFID的员工考勤系统设计
  10. 计算机基础试题及答案 完整版,大学计算机基础试题及答案(完整版)