10
集合:Vec、String、HashMap
Collections · Vec · String · HashMap
数组长度固定,变长数据靠标准库集合。最常用三个:Vec<T>(动态数组)、String(可变字符串)、HashMap<K,V>(哈希表)。
Vec<T>:动态数组
fn main() {
let mut v: Vec<i32> = Vec::new();
v.push(1);
v.push(2);
v.push(3);
// vec! 宏更常用
let mut v2 = vec![10, 20, 30];
// get 不会 panic,越界返回 None
println!("v[1]={:?}, 越界={:?}", v.get(1), v.get(99));
let last = v2.pop(); // 弹出末尾
v2.sort();
println!("弹出 {:?}, 排序后 {:?}", last, v2);
}
$ cargo run
v[1]=Some(2), 越界=None
弹出 Some(30), 排序后 [10, 20]
其他常用:with_capacity(n) 预分配、retain(|x| ...) 保留满足条件的、dedup() 去重相邻重复、iter()/iter_mut()/into_iter() 三种遍历。
String:UTF-8 可变字符串
fn main() {
let mut s = String::new();
s.push_str("你好");
s.push('!' );
let s2 = format!("{} {}", s, "世界"); // 拼字符串
// 遍历:chars() 是字符,bytes() 是字节
for c in s2.chars() { print!("[{}]", c); }
println!();
println!("{} 共 {} 字符", s2, s2.chars().count());
}
$ cargo run
[你][好][!][ ][世][界]
你好! 世界 共 6 字符
String vs &str:函数参数别用错
String 拥有堆数据、可变;&str 是借用的字符串切片。写函数参数时优先用 &str——它既能接 String 的引用,也能接字面量,最通用。别一上来就 String 参数,白白多拷贝。
HashMap<K, V>:哈希表
use std::collections::HashMap;
fn main() {
let mut scores = HashMap::new();
scores.insert(String::from("张三"), 90);
scores.insert(String::from("李四"), 85);
// get 返回 Option
println!("张三 {:?}", scores.get("张三"));
// entry API:没有就插入,有就不动(避免两次查找)
scores.entry(String::from("王五")).or_insert(100);
// 遍历
for (name, score) in &scores {
println!("{} = {}", name, score);
}
}
$ cargo run
张三 Some(90)
张三 = 90
李四 = 85
王五 = 100
| 集合 | 用途 |
|---|---|
| VecDeque | 双端队列,头尾都能高效增删 |
| LinkedList | 链表,实际很少用 |
| HashSet / BTreeSet | 去重集合(前者无序、后者有序) |
| BTreeMap | 按键排序的 Map,要有序遍历用它 |
| BinaryHeap | 最大堆,优先队列 |