在 Rust 中,集合是一种可以存储多个值的数据结构。与内建的数组和元组不同,集合中的数据存储在堆上,这意味着在编译时不需要知道集合的大小,并且集合的大小可以在程序运行时动态增长或缩小。
Rust 标准库提供了几种常见的集合类型,下面将详细介绍这些集合及其使用方法。
1. Vec<T>
(动态数组)
Vec<T>
是 Rust 中最常用的集合类型之一,它表示一个可变长度的、同类型元素的动态数组。
创建 Vec<T>
可以使用 Vec::new()
函数创建一个空的 Vec<T>
,也可以使用 vec!
宏创建带有初始值的 Vec<T>
。
fn main() {
// 创建一个空的 Vec<i32>
let mut v1: Vec<i32> = Vec::new();
// 使用 vec! 宏创建带有初始值的 Vec<i32>
let v2 = vec![1, 2, 3];
}
访问元素
可以使用索引或 get
方法来访问 Vec<T>
中的元素。
fn main() {
let v = vec![1, 2, 3];
// 使用索引访问元素
let first = v[0];
// 使用 get 方法访问元素
let second: Option<&i32> = v.get(1);
match second {
Some(value) => println!("The second element is {}", value),
None => println!("No second element found"),
}
}
修改 Vec<T>
可以使用 push
方法向 Vec<T>
中添加元素,使用 pop
方法移除并返回最后一个元素。
fn main() {
let mut v = vec![1, 2, 3];
// 向 Vec 中添加元素
v.push(4);
// 移除并返回最后一个元素
let last = v.pop();
match last {
Some(value) => println!("The last element was {}", value),
None => println!("The Vec is empty"),
}
}
2. String
(字符串)
String
是 Rust 中用于存储可变的 UTF - 8 编码字符串的集合类型。
创建 String
可以使用 String::new()
创建一个空的 String
,也可以使用 to_string
方法将其他类型转换为 String
。
fn main() {
// 创建一个空的 String
let mut s1 = String::new();
// 将字符串字面量转换为 String
let s2 = "hello".to_string();
// 使用 from 函数创建 String
let s3 = String::from("world");
}
修改 String
可以使用 push_str
方法添加字符串切片,使用 push
方法添加单个字符。
fn main() {
let mut s = String::from("hello");
// 添加字符串切片
s.push_str(", world");
// 添加单个字符
s.push('!');
println!("{}", s);
}
字符串拼接
可以使用 +
运算符或 format!
宏来拼接字符串。
fn main() {
let s1 = String::from("hello");
let s2 = String::from(" world");
// 使用 + 运算符拼接字符串
let s3 = s1 + &s2;
// 使用 format! 宏拼接字符串
let s4 = format!("{}{}", s3, "!");
println!("{}", s4);
}
3. HashMap<K, V>
(哈希映射)
HashMap<K, V>
是一种键值对存储的数据结构,它使用哈希函数来确定键的存储位置。
创建 HashMap<K, V>
可以使用 HashMap::new()
创建一个空的 HashMap<K, V>
,也可以使用迭代器和 collect
方法创建带有初始值的 HashMap<K, V>
。
use std::collections::HashMap;
fn main() {
// 创建一个空的 HashMap<String, i32>
let mut scores = HashMap::new();
// 添加键值对
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
// 使用迭代器和 collect 方法创建 HashMap
let teams = vec![String::from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];
let scores: HashMap<_, _> = teams.into_iter().zip(initial_scores.into_iter()).collect();
}
访问 HashMap<K, V>
中的值
可以使用 get
方法来访问 HashMap<K, V>
中的值。
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_name = String::from("Blue");
let score: Option<&i32> = scores.get(&team_name);
match score {
Some(value) => println!("The score of {} is {}", team_name, value),
None => println!("No score found for {}", team_name),
}
}
修改 HashMap<K, V>
可以使用 insert
方法插入或更新键值对,使用 remove
方法移除键值对。
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
// 更新键值对
scores.insert(String::from("Blue"), 20);
// 移除键值对
scores.remove(&String::from("Blue"));
}
4. HashSet<T>
(哈希集合)
HashSet<T>
是一种只存储唯一值的集合,它基于 HashMap<T, ()>
实现。
创建 HashSet<T>
可以使用 HashSet::new()
创建一个空的 HashSet<T>
,并使用 insert
方法添加元素。
use std::collections::HashSet;
fn main() {
let mut set = HashSet::new();
// 添加元素
set.insert(1);
set.insert(2);
set.insert(3);
}
检查元素是否存在
可以使用 contains
方法检查 HashSet<T>
中是否包含某个元素。
use std::collections::HashSet;
fn main() {
let mut set = HashSet::new();
set.insert(1);
if set.contains(&1) {
println!("The set contains 1");
} else {
println!("The set does not contain 1");
}
}
移除元素
可以使用 remove
方法从 HashSet<T>
中移除元素。
use std::collections::HashSet;
fn main() {
let mut set = HashSet::new();
set.insert(1);
// 移除元素
set.remove(&1);
}
这些集合类型为 Rust 开发者提供了强大而灵活的数据存储和操作能力,能够满足各种不同的编程需求。