本文全面介绍 Rust 集合常用方法,通过示例代码让你轻松掌握集合操作。
// 创建空 Vec
let mut vec1: Vec<i32> = Vec::new();
// 使用宏创建
let mut vec2 = vec![1, 2, 3];
// 预分配容量
let mut vec3 = Vec::with_capacity(10);
在 Rust 中,Vec
是一种动态数组,可存储相同类型的元素。Vec::new()
用于创建一个空的 Vec
,其类型需要显式指定。使用 vec!
宏可以方便地创建并初始化一个 Vec
。而 Vec::with_capacity
则可以预先分配一定的容量,避免后续添加元素时频繁的内存重新分配。
let mut vec = vec![1, 2, 3];
// 在末尾添加元素
vec.push(4); // [1, 2, 3, 4]
// 在指定位置插入元素
vec.insert(1, 5); // [1, 5, 2, 3, 4]
// 拼接另一个 Vec
vec.extend([6, 7].iter().copied()); // [1, 5, 2, 3, 4, 6, 7]
push
方法用于在 Vec
的末尾添加一个元素。insert
方法可以在指定的索引位置插入一个元素,后续元素会依次后移。extend
方法则可以将另一个可迭代对象中的元素添加到当前 Vec
的末尾。
let mut vec = vec![1, 2, 3, 4, 5];
// 移除并返回最后一个元素
let last = vec.pop(); // Some(5), vec = [1, 2, 3, 4]
// 移除指定位置元素
let removed = vec.remove(1); // 2, vec = [1, 3, 4]
// 清空 Vec
vec.clear(); // []
pop
方法会移除并返回 Vec
的最后一个元素,如果 Vec
为空,则返回 None
。remove
方法用于移除指定索引位置的元素,并返回该元素。clear
方法会清空 Vec
中的所有元素。
let vec = vec![1, 2, 3, 4, 5];
// 通过索引访问
let first = vec[0]; // 1
// 安全访问
let second = vec.get(1); // Some(&2)
// 获取第一个和最后一个元素
let first = vec.first(); // Some(&1)
let last = vec.last(); // Some(&5)
可以使用 []
操作符直接通过索引访问 Vec
中的元素,但如果索引越界,会导致程序崩溃。get
方法则提供了一种安全的访问方式,它返回一个 Option
类型,如果索引有效,则返回 Some(&element)
,否则返回 None
。first
和 last
方法分别用于获取 Vec
的第一个和最后一个元素,同样返回 Option
类型。
let vec = vec![1, 2, 3];
// 不可变遍历
for num in &vec {
println!("{}", num);
}
// 可变遍历
let mut vec = vec![1, 2, 3];
for num in &mut vec {
*num += 1;
}
// 使用迭代器方法
let sum: i32 = vec.iter().sum();
可以使用 for
循环对 Vec
进行遍历。如果只需要读取元素,可以使用不可变引用 &vec
。如果需要修改元素,则使用可变引用 &mut vec
。此外,Vec
还实现了迭代器 trait,可以使用迭代器方法,如 sum
来对元素进行求和。
use std::collections::HashMap;
// 创建空 HashMap
let mut map1: HashMap<&str, i32> = HashMap::new();
// 使用宏创建
let mut map2 = HashMap::from([
("a", 1),
("b", 2),
("c", 3),
]);
HashMap
是 Rust 中的哈希表,用于存储键值对。要使用 HashMap
,需要先引入 std::collections::HashMap
。可以使用 HashMap::new()
创建一个空的 HashMap
,并显式指定键和值的类型。也可以使用 HashMap::from
宏来创建并初始化一个 HashMap
。
let mut map = HashMap::new();
// 插入键值对
map.insert("one", 1);
map.insert("two", 2);
// 更新值
map.insert("one", 11); // 覆盖原有值
// 只在键不存在时插入
map.entry("three").or_insert(3);
insert
方法用于插入或更新键值对。如果键已经存在,新的值会覆盖旧的值。entry
方法提供了一种更灵活的插入方式,or_insert
方法会检查键是否存在,如果不存在则插入指定的值。
let mut map = HashMap::from([
("a", 1),
("b", 2),
("c", 3),
]);
// 移除指定键
let value = map.remove("b"); // Some(2)
// 清空 HashMap
map.clear();
remove
方法用于移除指定键的键值对,并返回该键对应的值。如果键不存在,则返回 None
。clear
方法会清空 HashMap
中的所有键值对。
let map = HashMap::from([
("a", 1),
("b", 2),
("c", 3),
]);
// 通过键访问
let a = map.get("a"); // Some(&1)
// 检查键是否存在
let has_a = map.contains_key("a"); // true
// 获取所有键或值
let keys: Vec<_> = map.keys().collect();
let values: Vec<_> = map.values().collect();
可以使用 get
方法通过键来访问 HashMap
中的值,返回一个 Option
类型。contains_key
方法用于检查指定的键是否存在于 HashMap
中。keys
和 values
方法分别用于获取 HashMap
中所有的键和值的迭代器,可以使用 collect
方法将其收集到一个 Vec
中。
let map = HashMap::from([
("a", 1),
("b", 2),
("c", 3),
]);
// 遍历键值对
for (key, value) in &map {
println!("{}: {}", key, value);
}
// 可变遍历
let mut map = HashMap::from([
("a", 1),
("b", 2),
]);
for (_, value) in &mut map {
*value += 10;
}
可以使用 for
循环对 HashMap
进行遍历。不可变遍历会返回键值对的不可变引用,可变遍历则返回可变引用。在可变遍历中,可以修改值但不能修改键。
use std::collections::HashSet;
// 创建空 HashSet
let mut set1: HashSet<i32> = HashSet::new();
// 使用宏创建
let mut set2 = HashSet::from([1, 2, 3]);
HashSet
是 Rust 中的哈希集合,用于存储唯一的元素。使用时需要引入 std::collections::HashSet
。可以使用 HashSet::new()
创建一个空的 HashSet
,并显式指定元素类型。也可以使用 HashSet::from
宏来创建并初始化一个 HashSet
。
let mut set = HashSet::new();
// 添加元素
set.insert(1);
set.insert(2);
insert
方法用于向 HashSet
中添加元素。如果元素已经存在,则不会重复添加,并且 insert
方法会返回 false
;如果元素不存在,则添加成功并返回 true
。
let mut set = HashSet::from([1, 2, 3]);
// 移除元素
let removed = set.remove(&2); // true
remove
方法用于移除 HashSet
中的指定元素。如果元素存在,则移除并返回 true
;如果元素不存在,则返回 false
。
let set = HashSet::from([1, 2, 3]);
// 检查元素是否存在
let has_2 = set.contains(&2); // true
contains
方法用于检查指定的元素是否存在于 HashSet
中,返回一个布尔值。
let set = HashSet::from([1, 2, 3]);
// 遍历元素
for num in &set {
println!("{}", num);
}
可以使用 for
循环对 HashSet
进行遍历,遍历顺序是不确定的。
通过以上介绍,你已经了解了 Rust 中 Vec
、HashMap
和 HashSet
这三种常用集合的常用方法。掌握这些方法可以让你更加高效地使用 Rust 进行开发。