【Rust】集合Vector基本操作|结合enum多类型存储

  前言

  Rust 常用集合也含有Vector容器,我们在其他语言例如C++中对此较为熟知,但是在用法上却有着不小的区别。最典型的莫过于租借规则对其作用的影响。本篇博客将介绍Rust 中的常用集合 Vector,学会它就可以向 Rust算法题征战了。


1、Vector 存储特点

Vec<T> 叫做 Vector,有如下特点:

  • 由标准库提供,可存储多个值
  • 只能存储相同类型的数据,元素值在内存中是连续存放的
  • 可以在末尾动态添加元素值
    • 我们浅谈一下工作原理:
    • 动态添加不仅指的是可以在末尾添加元素值,更是因为当该连续内存块不能满足需求的时候,Vector会重新分配一块内存大的空间来存储各元素值,这也叫动态内存

2、Vector基本操作

2.1、创建 Vector容器

  1. 使用 Vec::new 函数
    • 示例:
        let v: Vec<i32> = Vec::new();//需指定类型如 i32
      • 虽然Rust 具有强大的类型推导能力,但是仅靠Vec::new只能创建一个空的vector容器
        如果不再进行下一步操作,那我们就需要显示的声明数据类型。
  2. 使用 vec!
    • 这是一个利用初始值创建的方法:
        let v = vec![14,28,66];
    • 无需进行显示声明类型,通过初始值可以由编译器自动推导。

2.2、添加元素值

  • 向 Vector 添加元素,使用push方法

    • 示例:
        let mut v = Vec::new();
        v.push(6);
        v.push(2);
        // 这里不需要显示声明类型,因为创建后又添加了元素值。
    • 注意v前加上了mut关键字,因为是添加元素,需要声明为可变的变量。

    2.3、删除 Vector

    • 与其他任何 struct 一样,当Vector 离开作用域后就会被销毁,
      而容器中的元素值也会随之被清理。
    • 删除操作看着很简单,不需要我们代码操作,
      但是牵扯到对其中元素的引用的话情况就会复杂许多,继续往下看。

    2.3、读取元素值(引用)

  1. 通过索引读取元素

  2. 通过 get方法

  3. 示例:

     fn main() {
         let v =vec![1,2,3,4,5,6];
         let fourth = &v[3];
         println!("The exact element is {}",fourth);
    
         match v.get(3) {
             Some(four)=>println!("The exact element is {}",four),
             None => println!("Null")
         }
     }
     //运行结果为两边:The exact element is 4
  4. 二者区别

    • 当索引超过当前数组长度会引起painc恐慌,程序会崩溃中止。
    • 使用与match配对的get方法越界时则会打印Null,不会中止程序。

2.4、遍历Vector 中的值

  • 使用for循环:

    fn main() {
        let  v = vec![10,24,30,50];
        for i in &v{
            println!("{}",i);
          }
    }
    //运行结果:10 24 30 50
    • 实现对每一个元素的基本运算
       fn main() {
              let mut v= vec![10,24,30,50];
              for i in &mut v{
              *i+=10;
              println!("{}",i);
          }
      }
      //运行结果:20 34 40 60

      如果是简单的读取所有元素值,那么方法跟python 的for循环完全一致,但如果想对元素值进行操作就要声明v为可变变量,in后需要加上&mut表示可变引用,这里的*i是每个索引对应的值,可以理解为c++中的解引用方法。

      3、所有权和借用规则的影响

  • 不能在同一作用域内同时拥有可变和不可变引用*

  • 该规则在Vector中也成立

  • 示例

       fn main() {
            let mut v= vec![10,24,30,50];
            let first = &v[0];
            v.push(66);
          println!("{}",first);
      }
      //这是有问题的代码
  • 报错信息:

  • error[E0502]: cannot borrow v as mutable because it is also borrowed as immutable*
    在这里插入图片描述

    • 英文的意思是不能把v租借为一个可变引用因为它已经是不可变的
    • 其实这跟Vector工作原理中的动态内存有关系,万一该容器重新为元素值分配空间,而first是不可变的引用,此时的 first 就没有了意义。

4、结合 enum存储多种数据类型

enum 的变体可以附加不同类型的数据且定义在同一个 enum类型下

综合实例:

#[derive(Debug)] //配合{:?},输出枚举的变体
enum Virous {
    Int(i32),
    Float(f64),
    Text(String)
}
//用来输出Vector所有元素
fn print_all(v:Vec<Virous>){
    for v in &v{
        println!("{:?}",v);
    }
}
fn main() {
   let v= vec![
    Virous::Int(99),
    Virous::Text(String::from("微凉秋意")),
    Virous::Float(38.6),
    Virous::Float(66.6)];
    //调用函数
    print_all(v);
}

代码解释:

  • Virous 是定义的枚举类,含有三种类型的变体:i32f64String
  • print_all 函数无返回、参数是存储Virous枚举类型的Vector集合,功能是进行遍历打印
  • 主函数是定义了变量v并初始化了四个元素值,三种类型都有涉及,最后调用函数完成运行

运行效果:

在这里插入图片描述


有关Rust常用集合Rust的分享就到此结束了,后续将会带来另外的常用集合。觉得写的不错可以点赞鼓励博主,给我不断更文的动力!

#后端#
全部评论
写的不错,已经收藏了
点赞
送花
回复
分享
发布于 2022-10-17 15:47 陕西
rust? woc 关注了。学长
点赞
送花
回复
分享
发布于 2023-11-07 20:30 北京
秋招专场
校招火热招聘中
官网直投

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
2 2 评论
分享
牛客网
牛客企业服务