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

2年前数据库教程46825
【Rust指南】常用集合Vector基本操作 | 结合enum多类型存储 微凉秋意 已于2022-10-02 17:07:39修改 697 收藏 98 分类专栏: 进军Rust 文章标签: rust 开发语言 后端 原力计划 于2022-10-02 17:07:01首次发布 进军Rust 专栏收录该内容 15 篇文章 28 订阅 订阅专栏

文章目录   前言1、Vector 存储特点2、Vector基本操作2.1、创建 Vector容器2.2、添加元素值2.3、删除 Vector2.3、读取元素值(引用)2.4、遍历Vector 中的值 3、所有权和借用规则的影响4、结合 enum存储多种数据类型

  前言

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


1、Vector 存储特点

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

由标准库提供,可存储多个值只能存储相同类型的数据,元素值在内存中是连续存放的可以在末尾动态添加元素值 我们浅谈一下工作原理:动态添加不仅指的是可以在末尾添加元素值,更是因为当该连续内存块不能满足需求的时候,Vector会重新分配一块内存大的空间来存储各元素值,这也叫动态内存。 2、Vector基本操作 2.1、创建 Vector容器 使用 Vec::new 函数 示例: let v: Vec<i32> = Vec::new();//需指定类型如 i32 虽然Rust 具有强大的类型推导能力,但是仅靠Vec::new只能创建一个空的vector容器 如果不再进行下一步操作,那我们就需要显示的声明数据类型。 使用 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、读取元素值(引用) 通过索引读取元素通过 get方法示例: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 二者区别 当索引超过当前数组长度会引起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 是定义的枚举类,含有三种类型的变体:i32、f64、Stringprint_all 函数无返回、参数是存储Virous枚举类型的Vector集合,功能是进行遍历打印主函数是定义了变量v并初始化了四个元素值,三种类型都有涉及,最后调用函数完成运行

运行效果:


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

相关文章

Python正则表达式保姆式教学,带你精通大名鼎鼎的正则!

Python正则表达式保姆式教学,带你精通大名鼎鼎的正则!...

3D深度相机调研【史上最全,不服来战】

3D深度相机调研【史上最全,不服来战】...

网络 卧槽!牛皮了,面试官居然把TCP三次握手四次挥手问的这么详细

网络 卧槽!牛皮了,面试官居然把TCP三次握手四次挥手问的这么详细...

C生万物 | 第一篇 —— 初识C语言【适合入门,建议收藏】

C生万物 | 第一篇 —— 初识C语言【适合入门,建议收藏】...

3D人体骨架检测(mediapipe)

3D人体骨架检测(mediapipe)...

整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶

整合Mybatis、Servlet、Mysql、Axios、Filter、Session写一个入门级项目:非常适合初接触JavaWeb的小白白来进阶...