Vectors

向量(Vector)是可调整大小的数组。与切片(Slice)类似,它们的大小在编译时是未知的,但可以随时增长或缩小。向量由 3 个参数表示:

  • 指向数据的指针
  • 长度
  • 容量

容量表示为向量预留的内存量。只要长度小于容量,向量就可以增长。当需要超过这个阈值时,向量会被重新分配更大的容量。

fn main() {
    // 迭代器可以被收集到向量中
    let collected_iterator: Vec<i32> = (0..10).collect();
    println!("将 (0..10) 收集到:{:?}", collected_iterator);

    // 可以使用 `vec!` 宏初始化向量
    let mut xs = vec![1i32, 2, 3];
    println!("初始向量:{:?}", xs);

    // 在向量末尾插入新元素
    println!("将 4 推入向量");
    xs.push(4);
    println!("向量:{:?}", xs);

    // 错误!不可变向量无法增长
    collected_iterator.push(0);
    // 修复:^ 注释掉此行

    // `len` 方法返回当前存储在向量中的元素数量
    println!("向量长度:{}", xs.len());

    // 使用方括号进行索引(索引从 0 开始)
    println!("第二个元素:{}", xs[1]);

    // `pop` 移除并返回向量的最后一个元素
    println!("弹出最后一个元素:{:?}", xs.pop());

    // 越界索引会导致 panic
    println!("第四个元素:{}", xs[3]);
    // 修复:^ 注释掉此行

    // 可以轻松地遍历 `Vector`
    println!("xs 的内容:");
    for x in xs.iter() {
        println!("> {}", x);
    }

    // 遍历 `Vector` 时,可以同时用一个单独的变量(`i`)
    // 来枚举迭代计数
    for (i, x) in xs.iter().enumerate() {
        println!("在位置 {} 的值是 {}", i, x);
    }

    // 借助 `iter_mut`,可变的 `Vector` 也可以被遍历,
    // 并且允许修改每个值
    for x in xs.iter_mut() {
        *x *= 3;
    }
    println!("更新后的向量:{:?}", xs);
}

更多 Vec 方法可以在 std::vec 模块中找到