Rust - 集合
Rust 的标准集合库提供了最常见的通用编程数据结构的 efficient implementations。本章讨论常用集合 − Vector、HashMap 和 HashSet 的实现。
Vector
Vector 是一个可调整大小的数组。它将值存储在连续的内存块中。预定义的结构 Vec 可用于创建 vector。Vector 的某些重要特性包括 −
Vector 可以在运行时增长或缩小。
Vector 是一个同构集合。
Vector 以特定顺序将数据存储为元素序列。Vector 中的每个元素都被分配一个唯一的索引号。索引从 0 开始,一直增加到 n-1,其中 n 是集合的大小。例如,在一个包含 5 个元素的集合中,第一个元素位于索引 0,最后一个元素位于索引 4。
Vector 只会将值追加到(或靠近)末尾。换句话说,Vector 可用于实现栈。
Vector 的内存在堆上分配。
语法 - 创建 Vector
let mut instance_name = Vec::new();
Vec 结构的静态方法 new() 用于创建 vector 实例。
或者,也可以使用 vec! 宏来创建 vector。语法如下 −
let vector_name = vec![val1,val2,val3]
下表列出了 Vec 结构的一些常用函数。
| 序号 | 方法 | 签名与描述 |
|---|---|---|
| 1 | new() | pub fn new()->Vect 构造一个新的空 Vec。在向其推送元素之前,vector 不会分配内存。 |
| 2 | push() | pub fn push(&mut self, value: T) 将元素追加到集合的末尾。 |
| 3 | remove() | pub fn remove(&mut self, index: usize) -> T 移除并返回 vector 中位置 index 处的元素,并将后续所有元素向左移位。 |
| 4 | contains() | pub fn contains(&self, x: &T) -> bool 如果切片包含具有给定值的元素,则返回 true。 |
| 5 | len() | pub fn len(&self) -> usize 返回 vector 中的元素数量,也称为其“长度”。 |
示例:创建 Vector - new()
要创建 vector,我们使用静态方法 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() 创建了一个 Vector。push(val) 函数将作为参数传递的值追加到集合中。len() 函数返回 vector 的长度。
输出
size of vector is :3 [20, 30, 40]
示例:创建 Vector - vec! 宏
以下代码使用 vec! 宏创建 vector。vector 的数据类型从分配给它的第一个值推断得出。
fn main() {
let v = vec![1,2,3];
println!("{:?}",v);
}
输出
[1, 2, 3]
如前所述,vector 只能包含相同数据类型的值。以下代码片段将抛出 error[E0308]: mismatched types 错误。
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()
移除并返回 vector 中位置 index 处的元素,并将后续所有元素向左移位。
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()
返回 vector 中的元素数量,也称为其“长度”。
fn main() {
let v = vec![1,2,3];
println!("size of vector is :{}",v.len());
}
输出
size of vector is :3
从 Vector 中访问值
可以使用对应的索引号访问 vector 中的单个元素。以下示例创建一个 vector 并打印第一个元素的值。
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
println!("{:?}",v[0]);
}
Output: `20`
也可以通过对集合的引用来获取 vector 中的值。
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
Map 是一种键值对(称为条目)的集合。Map 中的任意两个条目不能拥有相同的键。简而言之,Map 是一个查找表。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 返回 Map 中元素的数量。 |
| 3 | get() | pub fn get<Q: ?Sized>(&lself, k: &Q) -> Option<&V> where K:Borrow Q:Hash+ Eq 返回对应键的值的引用。 |
| 4 | iter() | pub fn iter(&self) -> Iter<K, V> 一个以任意顺序访问所有键值对的迭代器。迭代器元素类型是 (&'a K, &'a V)。 |
| 5 | contains_key | pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool 如果 Map 包含指定键的值,则返回 true。 |
| 6 | remove() | pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) -> Option<(K, V)> 从 Map 中移除一个键,如果键之前存在于 Map 中,则返回存储的键和值。 |
示例: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()
返回 Map 中元素的数量
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()
如果 Map 包含指定键的值,则返回 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()
从 Map 中移除一个键。
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 结构定义在 std::collections 模块中。要访问 HashSet 结构,必须显式导入该模块。
语法:创建 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,Q: Hash + Eq, 返回集合中与给定值相等的值的引用(如果存在)。 |
| 4 | iter() | pub fn iter(&self) -> Iter 返回一个迭代器,以任意顺序访问所有元素。迭代器元素类型为 |
| 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("");
names.insert("Mohtashim");//重复值不会被添加
println!("{:?}",names);
}
输出
{"", "Kannan", "Mohtashim"}
示例:len()
返回集合中元素的数量。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("");
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("");
names.insert("Mohtashim");
for name in names.iter() {
println!("{}",name);
}
}
输出
Mohtashim Kannan
示例:get()
返回集合中与给定值相等的值的引用(如果存在)。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("");
names.insert("Mohtashim");
match names.get(&"Mohtashim"){
Some(value)=>{
println!("found {}",value);
}
None =>{
println!("not found");
}
}
println!("{:?}",names);
}
输出
found Mohtashim
{"Kannan", "Mohtashim", ""}
示例 - contains()
如果集合包含指定值,则返回 true。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("");
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("");
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