0
点赞
收藏
分享

微信扫一扫

rust 索引

🌟🌟🌟

// 修 复 错 误 并 实 现 缺 失 的 代 码

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!")

}

举报

相关推荐

0 条评论