0
点赞
收藏
分享

微信扫一扫

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


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

文章目录

  • ​​  前言​​
  • ​​1、Vector 存储特点​​
  • ​​2、Vector基本操作​​
  • ​​2.1、创建 Vector容器​​
  • ​​2.2、添加元素值​​
  • ​​2.3、删除 Vector​​
  • ​​2.3、读取元素值(引用)​​
  • ​​2.4、遍历Vector 中的值​​
  • ​​3、所有权和借用规则的影响​​
  • ​​4、结合 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​​​容器
    如果不再进行下一步操作,那我们就需要显示的声明数据类型。
  1. 使用 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

  1. 二者区别
  • 当索引超过当前数组长度会引起​​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​​​、​​String​
  • ​print_all​​​ 函数无返回、参数是存储Virous枚举类型的​​Vector​​集合,功能是进行遍历打印
  • 主函数是定义了变量​​v​​并初始化了四个元素值,三种类型都有涉及,最后调用函数完成运行

运行效果:

【Rust指南】常用集合Vector基本操作 | 结合enum多类型存储_开发语言_02

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


举报

相关推荐

0 条评论