掌握Vec、HashMap、HashSet、VecDeque、BTreeMap等集合类型的使用和性能特征。
fn main() {
let mut v: Vec<i32> = Vec::new();
v.push(1); v.push(2); v.push(3);
let v2 = vec![1, 2, 3, 4, 5];
// 访问
let third = &v2[2]; // 索引(越界panic)
let third = v2.get(2); // 安全访问(Option)
// 遍历
for i in &mut v { *i *= 2; } // 可变遍历
// 容量管理
let mut v3 = Vec::with_capacity(100);
println!("len={} cap={}", v3.len(), v3.capacity());
v3.reserve(50);
v3.shrink_to_fit();
}
✅ 编译验证通过
use std::collections::HashMap;
fn main() {
let mut scores: HashMap<String, i32> = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Red"), 50);
// 访问
let team = "Blue";
if let Some(score) = scores.get(team) {
println!("{}: {}", team, score);
}
// 遍历
for (key, value) in &scores {
println!("{}: {}", key, value);
}
// 只在键不存在时插入
scores.entry(String::from("Yellow")).or_insert(25);
// 更新值
let text = "hello world wonderful world";
let mut map = HashMap::new();
for word in text.split_whitespace() {
let count = map.entry(word).or_insert(0);
*count += 1;
}
}
✅ 编译验证通过
use std::collections::HashSet;
fn main() {
let a: HashSet<i32> = [1, 2, 3, 4].into();
let b: HashSet<i32> = [3, 4, 5, 6].into();
// 集合运算
println!("交集: {:?}", a.intersection(&b).collect::<Vec<_>>());
println!("并集: {:?}", a.union(&b).collect::<Vec<_>>());
println!("差集: {:?}", a.difference(&b).collect::<Vec<_>>());
}
✅ 编译验证通过
use std::collections::{VecDeque, BTreeMap};
fn main() {
// 双端队列
let mut dq = VecDeque::new();
dq.push_back(1);
dq.push_front(2);
let front = dq.pop_front();
let back = dq.pop_back();
// 有序映射
let mut map = BTreeMap::new();
map.insert(3, "c");
map.insert(1, "a");
map.insert(2, "b");
// 遍历自动按key排序
for (k, v) in &map {
println!("{}: {}", k, v); // 1:a, 2:b, 3:c
}
// 范围查询
for (k, v) in map.range(2..=3) {
println!("range {}: {}", k, v);
}
}
✅ 编译验证通过
| 集合 | 查找 | 插入 | 删除 | 有序 |
|---|---|---|---|---|
Vec | O(n) | O(1)尾/O(n)中 | O(n) | 插入序 |
HashMap | O(1)均 | O(1)均 | O(1)均 | 无 |
BTreeMap | O(log n) | O(log n) | O(log n) | key序 |
VecDeque | O(n) | O(1)首尾 | O(1)首尾 | 插入序 |
HashSet | O(1)均 | O(1)均 | O(1)均 | 无 |
用HashMap+VecDeque实现LRU缓存。
读取文本,统计Top-N高频词。
用HashMap实现Union-Find数据结构。
掌握Rust集合类型——选择正确的数据结构
系统编程的核心挑战是在不牺牲安全的前提下获得最大性能。Rust如何实现这个目标:
所有权系统在编译期确定每个值的生命周期,不需要运行时垃圾回收。这意味着:无停顿、可预测延迟、更少内存占用。
泛型单态化、内联、LLVM优化——高级代码编译为与手写C相当的机器码。
Send/Sync trait在编译期保证:如果是并发访问,要么只读,要么互斥。数据竞争不可能发生。
| 特性 | Rust | C | C++ |
|---|---|---|---|
| 内存安全 | ✅ 编译期 | ❌ 手动 | ⚠️ 部分RAII |
| 线程安全 | ✅ 编译期 | ❌ | ❌ |
| 无GC | ✅ | ✅ | ✅ |
| 零成本抽象 | ✅ | ⚠️ 宏 | ✅ 模板 |
| 包管理 | ✅ Cargo | ❌ | ⚠️ vcpkg |
| 学习曲线 | 陡峭 | 中等 | 极陡 |
即使Rust保证内存安全和线程安全,仍需注意:
以下资源帮助你深入学习本课主题:
本课涉及的核心概念,确保你理解每一个:
| 术语 | 说明 |
|---|---|
| 所有权 | Rust内存管理的核心机制,每个值有唯一所有者 |
| 借用 | 通过引用访问数据,不获取所有权 |
| 生命周期 | 引用有效的范围,编译期分析工具 |
| trait | Rust的接口/抽象机制,类似其他语言的接口 |
| 泛型 | 参数化类型,零成本抽象 |
| 模式匹配 | 强大的数据解构和分支机制 |
| 零成本抽象 | 高层抽象不引入运行时开销 |
| fearless concurrency | 编译器保证线程安全 |
Q: Rust学习曲线真的很陡吗?
A: 前期确实需要适应所有权和借用检查器,但一旦理解了,这些概念会让你的代码更可靠。大多数人2-4周就能上手。
Q: Rust适合什么项目?
A: 系统编程、Web服务、CLI工具、嵌入式、WASM、网络服务、数据库等。基本上需要性能和安全的地方都适合。
Q: 遇到编译错误怎么办?
A: Rust编译器的错误信息非常友好!仔细阅读,通常会指出问题所在和修复建议。也可以用cargo clippy获取更多提示。