文章目录
前言
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
方法 - 示例:letmut v =Vec::new(); v.push(6); v.push(2);// 这里不需要显示声明类型,因为创建后又添加了元素值。
- 注意v
前加上了mut
关键字,因为是添加元素,需要声明为可变的变量。
2.3、删除 Vector
- 与其他任何 struct 一样,当Vector 离开作用域后就会被销毁, 而容器中的元素值也会随之被清理。
- 删除操作看着很简单,不需要我们代码操作, 但是牵扯到对其中元素的引用的话情况就会复杂许多,继续往下看。
2.3、读取元素值(引用)
- 通过索引读取元素
- 通过
get
方法 - 示例:
fnmain(){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
循环:fnmain(){let v =vec![10,24,30,50];for i in&v{println!("{}",i);}}//运行结果:10 24 30 50
- 实现对每一个元素的基本运算
fnmain(){letmut 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
中也成立 - 示例
fnmain(){letmut 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)]//配合{:?},输出枚举的变体enumVirous{Int(i32),Float(f64),Text(String)}//用来输出Vector所有元素fnprint_all(v:Vec<Virous>){for v in&v{println!("{:?}",v);}}fnmain(){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常用集合Rust的分享就到此结束了,后续将会带来另外的常用集合。觉得写的不错可以点赞鼓励博主,给我不断更文的动力!
版权归原作者 微凉秋意 所有, 如有侵权,请联系我们删除。