🌟🌟🌟
// 修 复 错 误 并 实 现 缺 失 的 代 码
fn main() {
let mut v = Vec::from([1, 2, 3]);
for i in 0..5 {
println!("{:?}", v[i])
}
for i in 0..5 {
// 实 现 这 里 的 代 码...
}
assert_eq!(v, vec![2, 3, 4, 5, 6]);
println!("Success!")
}
切片
与 String 的切片类似, Vec 也可以使用切片。如果说 Vec 是可变的,那它的切片就是不可变或者说只
读的,我们可以通过 & 来获取切片。
在 Rust 中,将切片作为参数进行传递是更常见的使用方式,例如当一个函数只需要可读性时,那传递
Vec 或 String 的切片 &[T] / &str 会更加适合。
5. 🌟🌟
// 修 复 错 误
fn main() {
let mut v = vec![1, 2, 3];
let slice1 = &v[..];
// 越 界 访 问 将 导 致 panic.
// 修 改 时 必 须 使 用 `v.len`
let slice2 = &v[0..4];
assert_eq!(slice1, slice2);
// 切 片 是 只 读 的
// 注 意 : 切 片 和 `&Vec` 是 不 同 的 类 型 , 后 者 仅 仅 是 `Vec` 的 引 用 , 并 可 以 通 过 解 引 用 直 接 获 取
let vec_ref: &mut Vec<i32> = &mut v;
(*vec_ref).push(4);
let slice3 = &mut v[0..3];
slice3.push(4);
assert_eq!(slice3, &[1, 2, 3, 4]);
println!("Success!")
}
容量
容量 capacity 是已经分配好的内存空间,用于存储未来添加到 Vec 中的元素。而长度 len 则是当前
Vec 中已经存储的元素数量。如果要添加新元素时,长度将要超过已有的容量,那容量会自动进行增长:
Rust 会重新分配一块更大的内存空间,然后将之前的 Vec 拷贝过去,因此,这里就会发生新的内存分配(
目前 Rust 的容量调整策略是加倍,例如 2 -> 4 -> 8 ..)。
若这段代码会频繁发生,那频繁的内存分配会大幅影响我们系统的性能,最好的办法就是提前分配好足够
的容量,尽量减少内存分配。
6. 🌟🌟
// 修 复 错 误
fn main() {
let mut vec = Vec::with_capacity(10);
assert_eq!(vec.len(), __);
assert_eq!(vec.capacity(), 10);
// 由 于 提 前 设 置 了 足 够 的 容 量 , 这 里 的 循 环 不 会 造 成 任 何 内 存 分 配...
for i in 0..10 {
vec.push(i);
}
assert_eq!(vec.len(), __);
assert_eq!(vec.capacity(), __);
// ...但 是 下 面 的 代 码 会 造 成 新 的 内 存 分 配
vec.push(11);
assert_eq!(vec.len(), 11);
assert!(vec.capacity() >= 11);
// 填 写 一 个 合 适 的 值 , 在 `for` 循 环 运 行 的 过 程 中 , 不 会 造 成 任 何 内 存 分 配
let mut vec = Vec::with_capacity(__);
for i in 0..100 {
vec.push(i);
}
assert_eq!(vec.len(), __);
assert_eq!(vec.capacity(), __);
println!("Success!")
}