关键词:
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从入门到精通04-数据类型
Rust是静态类型(staticallytyped)语言,也就是说在编译时就必须知道所有变量的类型。在Rust中,每一个值都属于某一个数据类型(datatype),分为两大类:①、标量(scalar):整型、浮点型、布尔类型、字符类型②、复合(compound... 查看详情
rust从入门到精通10-所有权
在介绍rust所有权时,我们先介绍内存管理的一些基础概念。1、堆和栈一个进程在执行的时候,它所占用的内存虚拟空间一般被分割为好几个区域,我们称为”段“(Segment)。常见的几个段如下:①、代码段:编译后的机器码存... 查看详情
rust从入门到精通05-语句和表达式
1、语句和表达式语句和表达式是Rust语言实现逻辑控制的基本单元。在Rust程序里面,语句(Statement)是执行一些操作但不返回的指令,表达式(Expressions)计算并产生一个值。表达式可以是语句的一部分,反过来,语句也可以是... 查看详情
es6从入门到精通#10:set集合数据类型(代码片段)
说明ES6从入门到精通系列(全23讲)学习笔记。Set集合集合:表示无重复值的有序列表letkaimo=newSet();console.log(kaimo)添加元素letkaimo=newSet();kaimo.add(3);kaimo.add("1");kaimo.add(3);kaimo.add([3,1,3])con 查看详情
es6从入门到精通系列学习笔记23篇(完结)
说明ES6从入门到精通系列(全23讲)学习笔记。可以自行搜索B站,有小马哥的视频学习。目录ES6从入门到精通#01:ES6介绍ES6从入门到精通#02:let和const命令ES6从入门到精通#03:模板字符串ES6从入门到精通#04&... 查看详情
阅读《android从入门到精通》(12)——自动完成文本框(代码片段)
自动完成文本框(AutoCompleteTextView)java.lang.Object;android.view.View;android.view.TextView;android.widget.EditText;android.widget.AutoCompleteTextView;MultiAutoCompleteTextView;AutoCompleteTe 查看详情
es6从入门到精通#12:数组的扩展方法一(代码片段)
说明ES6从入门到精通系列(全23讲)学习笔记。数组的方法fromfrom()将伪数组转换成真正的数组例子:Argumentsfunctionadd() console.log(arguments) //es5 console.log([].slice.call(arguments)) //es6 console.log(Array.from(argume 查看详情
jetpack架构组件从入门到精通
今日分享资料Jetpack架构组件从入门到精通链接:https://pan.baidu.com/s/12WAXF-6wSuXkxM8NGKP_KQ提取码:3nhf 查看详情
android学习资料入门到精通(pdf集合)共54本
最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面下面是网盘内容14天学会安卓开发_(完整版).pdfAndroid4 游戏高级编程 第2版.pdfAndroid4.4SDKReference(2014.1... 查看详情
es6从入门到精通#10:set集合数据类型(代码片段)
说明ES6从入门到精通系列(全23讲)学习笔记。Set集合集合:表示无重复值的有序列表letkaimo=newSet();console.log(kaimo)添加元素letkaimo=newSet();kaimo.add(3);kaimo.add("1");kaimo.add(3);kaimo.add([3,1,3])console.log(kaimo)删除元素k... 查看详情
用python2.7编的小游戏
...到了相关教程。自己用google搜:用Python和Pygame写游戏-从入门到精通(目录)就可以找到了。其是一系列的帖子:系统学习部分用Python和Pygame写游戏-从入门到精通(1)Pygame的历史,安装Pygame,第一个Pygame脚本用Python和Pygame写游戏... 查看详情
python从入门到精通python中的set集合(每个人都是唯一的个体)(代码片段)
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。本文主要介绍Python数据类型中的集合(set和frozenset),咱们一次把集合聊个透彻。干货满满,建议收藏,需要用到时常看看。小伙伴们如... 查看详情
《wireshark从入门到精通》
视频选集3/20P1wireshark从入门到精通P2wireshark入门到精通2P3wireshark入门到精通3P4wireshark入门到精通4P5wireshark入门到精通5P6wireshark入门到精通6P7wireshark入门到精通7P8wireshark入门到精通8P9wireshark入门到精通9P10wireshark入门到精通10P11w... 查看详情
oracle从入门到精通系列讲解-总目录(代码片段)
总目录欢迎大家来到Lucifer三思而后行的《Oracle从入门到精通系列》,开始前博主先列出Oracle学习的大纲,同时这也可以作为大家学习Oracle的参考。下面蓝字都是传送门,点击进入即可:学前必读Oracle从入门到精通... 查看详情
wpfmvvm从入门到精通3:数据绑定
原文:WPFMVVM从入门到精通3:数据绑定 ?WPFMVVM从入门到精通1:MVVM模式简介WPFMVVM从入门到精通2:实现一个登录窗口WPFMVVM从入门到精通3:数据绑定WPFMVVM从入门到精通4:命令和事件WPFMVVM从入门到精通5:PasswordBox的绑... 查看详情
tkinterdesigner从入门到精通视频教程
...!欢迎使用TKinterDesigner!以下是《TKinterDesigner从入门到精通》哔哩哔哩视频教程第一讲:《TKinterDesigner从入门到精通》第一讲第二讲:《TKinterDesigner从入门到精通》第二讲第三讲:《TKinterDesigner从入门到精通... 查看详情
tkinterdesigner从入门到精通视频教程
...!欢迎使用TKinterDesigner!以下是《TKinterDesigner从入门到精通》哔哩哔哩视频教程第一讲:《TKinterDesigner从入门到精通》第一讲第二讲:《TKinterDesigner从入门到精通》第二讲第三讲:《TKinterDesigner从入门到精通... 查看详情
scala从入门到精通之四-映射和元组
在Scala中映射之键值对的集合,元组是n个对象的聚集,但是对象的类型不一定相同本节内容要点 Scala中映射的创建,遍历和查询 如何从可变和不可变映射中做出选择 Scala映射和Java映射见的互操作 Scala中元组... 查看详情