Vec 的常用函数和链式调用里每个方法一次讲清,可以直接当“速查表”。
一、Vec 自身常用函数(非全部,但足够覆盖 90% 场景)
| 分类 | 典型函数 | 一句话说明 |
|---|---|---|
| 创建 | Vec::new() / vec![] | 空 Vec / 宏初始化 |
| 增 | push(e) / extend(iter) / insert(idx, e) | 尾部追加、批量追加、指定位置插入 |
| 删 | pop() / remove(idx) / clear() | 尾部弹出、按索引删、清空 |
| 改 | swap(i, j) / reverse() / sort() / dedup() | 交换、反转、排序、去重(相邻) |
| 查 | len() / is_empty() / contains(&e) / binary_search(&e) | 长度、空判断、包含、二分查找 |
| 内存 | capacity() / reserve(n) / shrink_to_fit() | 容量、预分配、缩容 |
| 转换 | into_boxed_slice() / into_iter() / as_slice() | 转 Box 切片、转迭代器、转切片 |
| 迭代器 | iter() / iter_mut() / drain(range) | 只读、可变、移除并迭代 |
二、链式调用逐段拆解
let map: HashMap<usize, &str> = v.iter()
.enumerate()
.collect();
| 方法 | 作用 | 输入→输出 |
|---|---|---|
.iter() | 产生只读迭代器,元素是 &T | Vec<T> → Iterator<Item=&T> |
.enumerate() | 把每个元素再包一层“序号”,变成 (idx, &T) | Iterator<Item=&T> → Iterator<Item=(usize, &T)> |
.collect() | 把任何迭代器“收集”成指定集合类型;这里目标类型是 HashMap<usize, &str>,只要元素是 (K, V) 就能直接收 | Iterator<Item=(usize, &str)> → HashMap<usize, &str> |
三、快速对比三种迭代器
| 调用 | 元素类型 | 能否修改 | 所有权 |
|---|---|---|---|
v.iter() | &T | 否 | 不消耗 v |
v.iter_mut() | &mut T | 能 | 不消耗 v |
v.into_iter() | T | 能 | 消耗 v,之后不能再使用 v |
四、再来两个常见链式例子
// 1. 把 vec 里每个数平方后收集成新 Vec
let v2: Vec<i32> = v.iter().map(|x| x * x).collect();
// 2. 找出值大于 10 的索引
let idxs: Vec<usize> = v.iter()
.enumerate()
.filter(|(_, &val)| val > 10)
.map(|(i, _)| i)
.collect();
背住这三板斧,就能随意组合:
iter/iter_mut/into_iter
→enumerate/map/filter
→collect/fold/count/sum…

被折叠的 条评论
为什么被折叠?



