Rust 学习笔记(15)-Vector

Vector 是《Rust 程序设计语言》第8.1章 使用 Vector 储存列表 而来的结果

我想强调是,书中这一章节主要是在讲集合,集合是一种存储数据的容器,
我把它理解为一种工具,对于这种工具我们不用太过纠结其原理,只要大致了解下它有什么用,怎么用,在适合的时候,能想的起来应该用它就行

Vector 的特点: 只能储存相同类型的值,Vector 可以理解为一个动态数组

  • Vector 的创建
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
fn main() {
    // 注意这里我们增加了一个类型注解。
    // 因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。
    // 这是一个非常重要的点。vector 是用泛型实现的
    // 所有你需要知道的就是 Vec 是一个由标准库提供的类型,它可以存放任何类型。
    // 而当 Vec 存放某个特定类型时,那个类型位于尖括号中。
    // 在更实际的代码中,一旦插入值 Rust 就可以推断出想要存放的类型,所以你很少会需要这些类型注解。
    let v1: Vec<i32> = Vec::new(); // 创建一个只能装i32类型的Vector容器
    println!("{:?}", v1);

    // 更常见的做法是使用初始值来创建一个 Vec,而且为了方便 Rust 提供了 vec! 宏。
    // 这个宏会根据我们提供的值来创建一个新的 Vec。
    let v2 = vec![1, 2, 3];
    println!("{:?}", v2);
}
  • Vector 的更新与读取
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
fn main() {
    // 对于新建一个 vector 并向其增加元素,可以使用 push 方法。
    let mut v3: Vec<i32> = Vec::new();
    v3.push(1);
    v3.push(2);
    v3.push(3);
    v3.push(4);
    println!("{:?}", v3);

    // 读取
    // 索引语法,这种方法当你引用一个不存在的索引会引发panic异常,不推荐
    let v4 = vec![1, 2, 3, 4, 5];
    let third: &i32 = &v4[2];
    println!("The third element is {}", third);

    // 使用 Vector 的 get 方法,这种方法当你引用一个不存在的索引会返回None
    match v4.get(2) {
        Some(third) => println!("The third element is {}", third),
        None => println!("There is no third element."),
    }
    // Rust 有两个引用元素的方法的原因是程序可以选择如何处理当索引值在 vector 中没有对应值的情况。
}
  • Vector 的遍历
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
fn main() {
    // 不能修改
    let v5 = vec![1, 2, 3, 4, 5];
    for i in v5 {
        println!("{}", i);
    }

    // 遍历其可变引用并修改它
    let mut v6 = vec![1, 2, 3, 4, 5];
    for i in &mut v6 {
        *i += 50; // 为了修改可变引用所指向的值,在使用 += 运算符之前必须使用解引用运算符(*)获取 i 中的值。
        println!("{}", i);
    }
}
  • Vector 也可以通过枚举来让它存储多个类型,不过我不建议这么做
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#[derive(Debug)]
enum SpreadsheetCell {
    Int(i32),
    Float(f64),
    Text(String),
}

fn main() {
    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];
    for i in row {
        println!("{:?}", i);
    }
}
updatedupdated2024-10-012024-10-01