【Rust】——Vector集合

个人专栏:

算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

Java基础:Java基础_IT闫的博客-CSDN博客

c语言:c语言_IT闫的博客-CSDN博客

MySQL:数据结构_IT闫的博客-CSDN博客

数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

C++:C++_IT闫的博客-CSDN博客

C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

python:python_IT闫的博客-CSDN博客

离散数学:离散数学_IT闫的博客-CSDN博客

​​​​​​Linux:​​​​Linux_Y小夜的博客-CSDN博客

Rust:Rust_Y小夜的博客-CSDN博客

欢迎收看,希望对大家有用!

目录

创建vector

更新Vector

删除Vector

 读取Vector元素

所有权和借用规则

使用enum来存储多种数据类型


第一个类型是 Vec,也被称为 vector:

  • 有标准库提供。
  • 允许我们在一个单独的数据结构中储存多于一个的值。
  • 它在内存中彼此相邻地排列所有的值。
  • vector 只能储存相同类型的值。

创建vector

为了创建一个新的空 vector,可以调用 Vec::new 函数

    let v: Vec = Vec::new();

        因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的。

        为了方便 Rust 提供了 vec! 宏,这个宏会根据我们提供的值来创建一个新的 vector。

    let v = vec![1, 2, 3];

        因为我们提供了 i32 类型的初始值,Rust 可以推断出 v 的类型是 Vec,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。

更新Vector

对于新建一个 vector 并向其增加元素,可以使用 push 方法

    let mut v = Vec::new();

    v.push(5);
    v.push(6);
    v.push(7);
    v.push(8);

        如果想要能够改变它的值,必须使用 mut 关键字使其可变。放入其中的所有值都是 i32 类型的,而且 Rust 也根据数据做出如此判断,所以不需要 Vec 注解。

删除Vector

类似于任何其他的 struct,vector 在其离开作用域时会被释放

    {
        let v = vec![1, 2, 3, 4];
    } 

 读取Vector元素

有两种方法引用 vector 中储存的值:

  • 通过索引
  • 使用 get 方法。
    let v = vec![1, 2, 3, 4, 5];

    let third: &i32 = &v[2];
    println!("The third element is {third}");

    let third: Option<&i32> = v.get(2);
    match third {
        Some(third) => println!("The third element is {third}"),
        None => println!("There is no third element."),
    }

        这里有几个细节需要注意:

  • 我们使用索引值 2 来获取第三个元素,因为索引是从数字 0 开始的。
  • 使用 & 和 [] 会得到一个索引位置元素的引用。
  • 当使用索引作为参数调用 get 方法时,会得到一个可以用于 match 的 Option<&T>

    let v = vec![1, 2, 3, 4, 5];

    let does_not_exist = &v[100];
    let does_not_exist = v.get(100);

        当运行这段代码,你会发现对于第一个 [] 方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。

        当 get 方法被传递了一个数组外的索引时,它不会 panic 而是返回 None。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理 Some(&element) 或 None 的逻辑。

所有权和借用规则

不能在相同作用域中同时存在可变和不可变引用。

    let mut v = vec![1, 2, 3, 4, 5];

    let first = &v[0];

    v.push(6);

    println!("The first element is: {first}");

        当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的。

遍历Vector中的值

使用 for 循环来获取 i32 值的 vector 中的每一个元素的不可变引用并将其打印

    let v = vec![100, 32, 57];
    for i in &v {
        println!("{i}");
    }

我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们:

    let mut v = vec![100, 32, 57];
    for i in &mut v {
        *i += 50;
    }

使用enum来存储多种数据类型

        vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举!

    enum SpreadsheetCell {
        Int(i32),
        Float(f64),
        Text(String),
    }

    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];

        Rust 在编译时就必须准确的知道 vector 中类型的原因在于它需要知道储存每个元素到底需要多少内存。第二个好处是可以准确的知道这个 vector 中允许什么类型。如果 Rust 允许 vector 存放任意类型,那么当对 vector 元素执行操作时一个或多个类型的值就有可能会造成错误。

你可能感兴趣的:(Rust(官方文档重点总结),rust,开发语言,后端)