Rust 的标准库(std::collections)提供了多种通用的集合数据结构。与基础的数组和元组不同,这些集合存储在 堆(Heap) 上,这意味着它们的大小可以在运行时动态增长或缩小。
1. 动态数组:Vec<T> (Vector)
rust
fn main() {
// 创建
let mut v = vec![1, 2, 3];
// 增加元素
v.push(4);
v.push(5);
// 读取元素 (索引方式)
let third = &v[2];
println!("第三个元素是: {}", third);
// 安全读取 (get 方法,返回 Option)
match v.get(10) {
Some(val) => println!("找到了: {}", val),
None => println!("索引越界,没有第11个元素"),
}
// 遍历
for i in &v {
println!("{}", i);
}
}
2. 字符串:String
rust
fn main() {
// 创建
let mut s = String::from("Hello");
// 更新
s.push_str(", Rust!"); // 追加字符串切片
s.push('🚀'); // 追加单个字符
// 合并字符串
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = format!("{}-{}-{}", s1, s2, "toe"); // 使用 format! 宏不获取所有权
println!("{}", s3); // tic-tac-toe
}
3. 哈希映射:HashMap<K, V>
rust
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 = scores.get(&team_name); // 返回 Option<&i32>
// 遍历
for (key, value) in &scores {
println!("{}: {}", key, value);
}
// 只有当键不存在时才插入 (Entry API)
scores.entry(String::from("Red")).or_insert(30);
}
| 集合 | 核心逻辑 | 典型应用场景 |
|---|---|---|
Vec<T> |
连续内存的动态数组 | 存储线性数据、任务清单、缓冲区。这是最通用的集合。 |
String |
UTF-8 编码的文本 | 存储和处理动态文本、用户输入、格式化字符串。 |
HashMap<K, V> |
哈希键值对映射 | 数据库索引模拟、缓存系统、统计(如单词计数)。 |
VecDeque<T> |
双端队列(环形缓冲区) | 实现先进先出(FIFO)队列、广度优先搜索(BFS)。 |
HashSet<T> |
唯一值的哈希集合 | 数据去重、成员身份快速验证(判断某项是否存在)。 |
BTreeMap<K, V> |
基于 B 树的有序映射 | 需要按键(Key)排序存储数据,或进行范围查询时。 |
BinaryHeap<T> |
二叉堆(优先队列) | 始终获取最大/最小值的场景,如任务调度、Dijkstra 算法。 |