- Rust 教程
- Rust - 首页
- Rust - 简介
- Rust - 环境搭建
- Rust - HelloWorld 例子
- Rust - 数据类型
- Rust - 变量
- Rust - 常量
- Rust - 字符串
- Rust - 运算符
- Rust - 决策
- Rust - 循环
- Rust - 函数
- Rust - 元组
- Rust - 数组
- Rust - 所有权
- Rust - 借用
- Rust - 切片
- Rust - 结构体
- Rust - 枚举
- Rust - 模块
- Rust - 集合
- Rust - 错误处理
- Rust - 泛型类型
- Rust - 输入输出
- Rust - 文件输入/输出
- Rust - 包管理器
- Rust - 迭代器和闭包
- Rust - 智能指针
- Rust - 并发
- Rust 有用资源
- Rust - 快速指南
- Rust - 有用资源
- Rust - 讨论
Rust - 集合
Rust 的标准集合库提供了对最常见通用编程数据结构的高效实现。本章讨论常用集合的实现——向量 (Vector)、哈希映射 (HashMap) 和哈希集合 (HashSet)。
向量 (Vector)
向量是一个可调整大小的数组。它将值存储在连续的内存块中。预定义结构 Vec 可用于创建向量。向量的某些重要特性包括:
向量可以在运行时增长或缩小。
向量是同构集合。
向量按特定顺序将数据存储为元素序列。向量中的每个元素都分配了一个唯一的索引号。索引从 0 开始,一直到 n-1,其中 n 是集合的大小。例如,在包含 5 个元素的集合中,第一个元素的索引为 0,最后一个元素的索引为 4。
向量只会在末尾(或附近)追加值。换句话说,向量可以用来实现栈。
向量的内存分配在堆上。
语法 - 创建向量
let mut instance_name = Vec::new();
Vec 结构的静态方法 new() 用于创建向量实例。
或者,也可以使用 vec! 宏创建向量。语法如下:
let vector_name = vec![val1,val2,val3]
下表列出了 Vec 结构的一些常用函数。
序号 | 方法 | 签名和描述 |
---|---|---|
1 | new() | pub fn new() -> Vec 构造一个新的空 Vec。除非向其中添加元素,否则向量不会分配内存。 |
2 | push() | pub fn push(&mut self, value: T) 将元素追加到集合的末尾。 |
3 | remove() | pub fn remove(&mut self, index: usize) -> T 移除并返回向量中索引位置处的元素,并将之后的所有元素向左移动。 |
4 | contains() | pub fn contains(&self, x: &T) -> bool 如果切片包含具有给定值的元素,则返回 true。 |
5 | len() | pub fn len(&self) -> usize 返回向量中的元素数量,也称为其“长度”。 |
示例:使用 new() 创建向量
要创建向量,我们使用静态方法 new:
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); println!("size of vector is :{}",v.len()); println!("{:?}",v); }
上面的例子使用在 Vec 结构中定义的静态方法 new() 创建了一个向量。push(val) 函数将作为参数传递的值追加到集合中。len() 函数返回向量的长度。
输出
size of vector is :3 [20, 30, 40]
示例:使用 vec! 宏创建向量
以下代码使用 vec! 宏创建了一个向量。向量的类型由赋给它的第一个值推断得出。
fn main() { let v = vec![1,2,3]; println!("{:?}",v); }
输出
[1, 2, 3]
如前所述,向量只能包含相同数据类型的多个值。以下代码片段将引发 error[E0308]: 类型不匹配 错误。
fn main() { let v = vec![1,2,3,"hello"]; println!("{:?}",v); }
示例:push()
将元素追加到集合的末尾。
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); println!("{:?}",v); }
输出
[20, 30, 40]
示例:remove()
移除并返回向量中索引位置处的元素,并将之后的所有元素向左移动。
fn main() { let mut v = vec![10,20,30]; v.remove(1); println!("{:?}",v); }
输出
[10, 30]
示例 - contains()
如果切片包含具有给定值的元素,则返回 true:
fn main() { let v = vec![10,20,30]; if v.contains(&10) { println!("found 10"); } println!("{:?}",v); }
输出
found 10 [10, 20, 30]
示例:len()
返回向量中的元素数量,也称为其“长度”。
fn main() { let v = vec![1,2,3]; println!("size of vector is :{}",v.len()); }
输出
size of vector is :3
从向量中访问值
可以使用相应的索引号访问向量中的各个元素。以下示例创建了一个向量并打印第一个元素的值。
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); println!("{:?}",v[0]); } Output: `20`
也可以使用对集合的引用来获取向量中的值。
fn main() { let mut v = Vec::new(); v.push(20); v.push(30); v.push(40); v.push(500); for i in &v { println!("{}",i); } println!("{:?}",v); }
输出
20 30 40 500 [20, 30, 40, 500]
哈希映射 (HashMap)
映射是键值对(称为条目)的集合。映射中不能有两个条目具有相同的键。简而言之,映射是一个查找表。HashMap 将键和值存储在哈希表中。条目以任意顺序存储。键用于在 HashMap 中搜索值。HashMap 结构在 std::collections 模块中定义。应显式导入此模块以访问 HashMap 结构。
语法:创建 HashMap
let mut instance_name = HashMap::new();
HashMap 结构的静态方法 new() 用于创建 HashMap 对象。此方法创建一个空的 HashMap。
下面讨论 HashMap 的常用函数:
序号 | 方法 | 签名和描述 |
---|---|---|
1 | insert() | pub fn insert(&mut self, k: K, v: V) -> Option 插入键值对,如果键不存在则返回 None。更新后,返回旧值。 |
2 | len() | pub fn len(&self) -> usize 返回映射中的元素数量。 |
3 | get() | pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow 返回对应于键的值的引用。 |
4 | iter() | pub fn iter(&self) -> Iter<'a, K, V> 一个以任意顺序访问所有键值对的迭代器。迭代器元素类型为 (&'a K, &'a V)。 |
5 | contains_key | pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool 如果映射包含指定键的值,则返回 true。 |
6 | remove() | pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) -> Option<(K, V)> 从映射中移除一个键,如果该键以前在映射中,则返回存储的键和值。 |
示例:insert()
将键值对插入到 HashMap 中。
use std::collections::HashMap; fn main(){ let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("{:?}",stateCodes); }
上面的程序创建了一个 HashMap 并用 2 个键值对对其进行初始化。
输出
{"KL": "Kerala", "MH": "Maharashtra"}
示例:len()
返回映射中的元素数量
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("size of map is {}",stateCodes.len()); }
上面的示例创建了一个 HashMap 并打印其中的元素总数。
输出
size of map is 2
示例 - get()
返回对应于键的值的引用。以下示例检索 HashMap 中键 KL 的值。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); println!("size of map is {}",stateCodes.len()); println!("{:?}",stateCodes); match stateCodes.get(&"KL") { Some(value)=> { println!("Value for key KL is {}",value); } None => { println!("nothing found"); } } }
输出
size of map is 2 {"KL": "Kerala", "MH": "Maharashtra"} Value for key KL is Kerala
示例 - iter()
返回一个迭代器,其中包含对所有键值对的引用,顺序任意。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); for (key, val) in stateCodes.iter() { println!("key: {} val: {}", key, val); } }
输出
key: MH val: Maharashtra key: KL val: Kerala
示例:contains_key()
如果映射包含指定键的值,则返回 true。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); stateCodes.insert("GJ","Gujarat"); if stateCodes.contains_key(&"GJ") { println!("found key"); } }
输出
found key
示例:remove()
从映射中移除一个键。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("KL","Kerala"); stateCodes.insert("MH","Maharashtra"); stateCodes.insert("GJ","Gujarat"); println!("length of the hashmap {}",stateCodes.len()); stateCodes.remove(&"GJ"); println!("length of the hashmap after remove() {}",stateCodes.len()); }
输出
length of the hashmap 3 length of the hashmap after remove() 2
哈希集合 (HashSet)
HashSet 是类型 T 的唯一值的集合。添加和删除值的速度很快,并且快速查询给定值是否在集合中。
语法:创建 HashSet
let mut hash_set_name = HashSet::new();
HashSet 结构的静态方法 new 用于创建 HashSet。此方法创建一个空的 HashSet。
下表列出了 HashSet 结构的一些常用方法。
序号 | 方法 | 签名和描述 |
---|---|---|
1 | insert() | pub fn insert(&mut self, value: T) -> bool 向集合中添加值。如果集合中不存在此值,则返回 true,否则返回 false。 |
2 | len() | pub fn len(&self) -> usize 返回集合中的元素数量。 |
3 | get() | pub fn get<Q: ?Sized>(&self, value: &Q) -> Option<&T> where T: Borrow 返回集合中与给定值相等的任何值的引用。 |
4 | iter() | pub fn iter(&self) -> Iter<'a, T> 返回一个以任意顺序访问所有元素的迭代器。迭代器元素类型为 &'a T。 |
5 | contains_key | pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool 如果集合包含值,则返回 true。 |
6 | remove() | pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool 从集合中移除值。如果集合中存在该值,则返回 true。 |
示例 - insert()
向集合中添加值。HashSet 不会向集合中添加重复值。
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); names.insert("Mohtashim");//duplicates not added println!("{:?}",names); }
输出
{"TutorialsPoint", "Kannan", "Mohtashim"}
示例:len()
返回集合中的元素数量。
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); println!("size of the set is {}",names.len()); }
输出
size of the set is 3
示例 - iter()
返回一个以任意顺序访问所有元素的迭代器。
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); names.insert("Mohtashim"); for name in names.iter() { println!("{}",name); } }
输出
TutorialsPoint Mohtashim Kannan
示例:get()
返回集合中与给定值相等的任何值的引用。
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); names.insert("Mohtashim"); match names.get(&"Mohtashim"){ Some(value)=>{ println!("found {}",value); } None =>{ println!("not found"); } } println!("{:?}",names); }
输出
found Mohtashim {"Kannan", "Mohtashim", "TutorialsPoint"}
示例 - contains()
如果集合包含值,则返回 true。
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); if names.contains(&"Kannan") { println!("found name"); } }
输出
found name
示例:remove()
从集合中移除值。
use std::collections::HashSet; fn main() { let mut names = HashSet::new(); names.insert("Mohtashim"); names.insert("Kannan"); names.insert("TutorialsPoint"); println!("length of the Hashset: {}",names.len()); names.remove(&"Kannan"); println!("length of the Hashset after remove() : {}",names.len()); }
输出
length of the Hashset: 3 length of the Hashset after remove() : 2