【RUST学习日记】第11课 向量 (上)

简介: 【RUST学习日记】第11课 向量 (上)

0x00 回顾与开篇


上一篇文章主要讲解了Rust的复合数据类型(Compound Types)——数组,元组。这节课继续讲解数据类型——向量(Vector),又称作动态数组。为跟数组区分且方便理解,课程中将把动态数组全部叫作“向量”。上一篇文章只是简单介绍了下数组的概念。


0x01 向量的定义


Vec是一种动态的可变数组,可以在运行时增长或者缩短数组的长度。其签名形式Vec<T>,T表示任意类型。Vec<T>叫做T类型的向量。向量的元素保存在上,这也是它可以动态增长或者缩短长度的原因。向量中的每个元素都分配有唯一的索引值,同数组一样,索引从0开始计数。


PS:本节课中的代码打印时都添加了 “&” 符号,其与Rust的所有权有关,这里了解即可,后面会详细介绍。 


0x02 向量的创建


向量常见的创建方式有以下3种:

1、使用Vec::new()创建一个空的向量。容量为0,长度为0的向量在堆上是不占内存的。通常创建向量时使用mut修饰,因为向量需要动态增删元素。需要指定类型。

let mut vec_empty: Vec<i32> = Vec::new();

2、[推荐方法] 初始化时为向量指定容量。容量不等于长度,不要跟长度混淆。下面是容量为10的空向量(长度为0)。需要指定类型。

let mut vec_capacity :Vec<i32> = Vec::with_capacity(5);

3、[推荐方法] 使用“宏”创建向量。这种方式的创建方法类似于数组的语法。它也有3种创建方式。

  • 创建空的向量。需要指定类型。
let mut vec_marco: Vec<i32> = vec![];
  • 创建带有默认元素的向量。支持类型推断。
let mut vec_marco = vec![1, 2, 3, 4, 5];
  • 创建指定长度且初始化所有元素的向量。支持类型推断。
// 长度为5,元素初始化为0
let mut vec_marco = vec![0; 5];


0x03 添加元素


使用push方法在向量的尾部添加新元素。下面的代码是在向量后面追加了元素1。添加元素需要将向量使用mut关键字修饰。

let mut vec_push = vec![0; 5];
vec_push.push(1);
dbg!(&vec_push);


0x04 修改元素


修改元素,直接使用“变量名称[索引] = 要修改的值”即可重新为元素赋值。下面的代码是将向量的第4个元素(索引值3的元素)的值修改为1。修改元素需要将向量使用mut关键字修饰。

let mut vec_push = vec![0; 5];
vec_push[3] = 1;
dbg!(&vec_push);


0x05 删除元素


Rust中有两种删除向量的元素的方式。删除元素需要将向量使用mut关键字修饰。

1、通过pop方法弹出队尾元素。调用pop方法会返回一个Option枚举类型。如果数组不为空,则会返回Some(v)v是弹出的值。如果向量为空,则会返回None(关于Option这里了解即可)。

示例代码如下:

let mut vec_pop = vec![1];
    let pop = vec_pop.pop();
    dbg!(pop);
    let pop = vec_pop.pop();
    dbg!(pop);

代码执行结果:

[src\main.rs:31] pop = Some(
    1,
)
[src\main.rs:33] pop = None

2、通过remove方法删除元素,需要传入将要删除元素的索引,并且返回删除的元素。这个操作会引发向量元素的移位,被删除元素的后面元素都会相应的左移一位。如果传入的索引大于向量的长度,则会产生程序错误

示例代码如下:

let mut vec_remove = vec!['w', 'o', 'r', 'l', 'd'];
    let remove_element = vec_remove.remove(3);
    dbg!(remove_element);
    // 索引越界,会发生错误
    // let remove_element = vec_remove.remove(5);

代码执行结果:

[src\main.rs:38] remove_element = 'l'
// 下面是越界的执行结果
thread 'main' panicked at 'removal index (is 5) should be < len (is 4)', library\alloc\src\vec\mod.rs:1347:13
stack backtrace:


0x06 小结


本篇文章仅仅简单介绍了下向量的创建,修改,以及删除等基础操作。其实,看起来向量的操作并没有很复杂是吧,处理向量的时候还是要注意越界的操作。有关于数组的区别将在下一篇文章具体介绍。源码也将在下一篇文章给出。

相关文章
|
9天前
|
存储 Rust 网络协议
【Rust学习】10_定义枚举
在这一章我们学习 枚举(enumerations),也被称作 enums。枚举允许你通过列举可能的 成员(variants) 来定义一个类型。首先,我们会定义并使用一个枚举来展示它是如何连同数据一起编码信息的。接下来,我们会探索一个特别有用的枚举,叫做 Option,它代表一个值要么是某个值要么什么都不是。然后会讲到在 match 表达式中用模式匹配,针对不同的枚举值编写相应要执行的代码。最后,我们将学习 if let 结构,另一个简洁方便处理代码中枚举的结构。
25 7
|
30天前
|
Rust 算法 安全
学习Rust
【10月更文挑战第13天】学习Rust
52 8
|
1月前
|
Rust 安全 算法
Rust的学习
【10月更文挑战第12天】Rust的学习
27 2
|
1月前
|
Rust 算法 安全
如何学习Rust编程?
【10月更文挑战第12天】如何学习Rust编程?
41 1
|
1月前
|
Rust API
【Rust学习】09_方法语法
结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,允许您指定结构体的实例具有的行为。 但是结构体并不是创建自定义类型的唯一方式:让我们转向 Rust 的 enum 功能,将另一个工具添加到你的工具箱中。
14 0
|
2月前
|
Rust 索引
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
92 2
|
2月前
|
存储 Rust 编译器
【Rust学习】07_结构体说明
**struct**或 ***structure***是一种自定义数据类型,允许您命名和包装多个相关的值,从而形成一个有意义的组合。如果您熟悉面向对象的语言,那么**struct**就像对象中的数据属性。在本章中,我们将比较和对比元组与结构体,在您已经知道的基础上,来演示结构体是对数据进行分组的更好方法。
24 1
|
2月前
|
存储 Rust 安全
30天拿下Rust之向量
30天拿下Rust之向量
24 0
|
3月前
|
存储 Rust 安全
【Rust学习】06_切片
所有权、借用和切片的概念确保了 Rust 程序在编译时的内存安全。Rust 语言提供了跟其他系统编程语言相同的方式来控制你使用的内存,但拥有数据所有者在离开作用域后自动清除其数据的功能意味着你无须额外编写和调试相关的控制代码。
25 1
|
2月前
|
Rust Linux Go
Rust/Go语言学习
Rust/Go语言学习