热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Rust向量

向量是一种单一数据结构,可以在内存中彼此相邻地存储多个值。当有一个项目列表(例如:购物车中的数据项)时,向量很有用。要点:向量用于存储相同类型的值。矢量由Vec表示。Vec

向量是一种单一数据结构,可以在内存中彼此相邻地存储多个值。 当有一个项目列表(例如:购物车中的数据项)时,向量很有用。

要点:

  • 向量用于存储相同类型的值。
  • 矢量由Vec 表示。
  • Vec 由标准库提供,它可以保存任何类型的数据,其中T确定向量的类型。
  • 向量的数据在堆上分配。
  • 向量是一个可增长的数组意味着可以在运行时添加新元素。

Vec :当向量保持特定类型时,它在角括号中表示。

如何创建向量?

可以使用Vec::new()函数创建向量,参考以下示例代码 :

Let v : Vec = Vec::new();

在上面的声明中,vi32类型的向量,它是使用Vec::new() 函数创建的。

还有另一种创建向量的方法:

Rust提供vec! 用于创建向量并保存提供的值的宏。

例如:

let v = vec![10,20,30,40,50];

注意:如果想重复向量的初始值,那么还有另一种实现vec的方法:

let v = vec![2 ; i];

在上面的声明中,向量v是使用包含值2,i次的向量宏创建的。

访问元素

可以使用下标运算符[]访问向量的特定元素。

通过下面一个例子来理解:

fn main()
{
let v =vec![20,30,40,50];
println!("first element of a vector is :{}",v[0]);
println!("Second element of a vector is :{}",v[1]);
println!("Third element of a vector is :{}",v[2]);
println!("Fourth element of a vector is :{}",v[3]);
}

执行上面示例代码,得到以下结果 –

first element of a vector is :20
Second element of a vector is :30
Third element of a vector is :40
Fourth element of a vector is :50

访问向量元素的第二种方法是使用get(index)方法,将vector的索引作为参数传递,并返回Option <&t>类型的值。

看下面一个示例代码 &#8211;

fn value(n:Option<&i32>)
{
match n
{
Some(n)=>println!("Fourth element of a vector is {}",n),
NOne=>println!("None"),
}
}
fn main()
{
let v =vec![20,30,40,50];
let a: Option<&i32>=v.get(3);
value(a);
}

执行上面示例代码,得到以下结果 &#8211;

Fourth element of a vector is 50

在上面的示例中,get()方法用于访问向量的第四个元素。

[]和get()方法的区别:

当使用[]运算符访问不存在的元素时,它会导致程序发生混乱。 因此,当尝试访问不存在的元素时,程序就会崩溃。 如果尝试使用get()方法访问该元素,则它返回None而不会发生崩溃。

通过下面一个例子来理解这一点:

  • get(index)函数

fn value(n:Option<&i32>)
{
match n
{
Some(n)=>println!("Fourth element of a vector is {}",n),
NOne=>println!("None"),
}
}
fn main()
{
let v =vec![20,30,40,50];
let a: Option<&i32>=v.get(7);
value(a);
}

执行上面示例代码,得到以下结果 &#8211;

None

  • []运算符

fn main()
{
let v =vec![20,30,40,50];
println!("{}",v[8]);
}

执行上面示例代码,得到以下结果 &#8211;

《Rust向量》

迭代向量中的值

如果想要访问向量的每个元素,那么可以迭代向量的元素,而不是使用索引来访问向量的特定元素。

可以使用for循环来迭代可变或不可变的引用。

下面来看一个不可变引用的简单示例:

fn main()
{
let v =vec![20,30,40,50];
print!("Elements of vector are :");
for i in v
{
print!("{} ",i);
}
}

执行上面示例代码,得到以下结果 &#8211;

Elements of vector are :20 30 40 50

下面来看一个可变引用的简单示例:

fn main()
{
let mut v =vec![20,30,40,50];
print!("Elements of vector are :");
for i in &mut v
{
*i+=20;
print!("{} ",i);
}
}

执行上面示例代码,得到以下结果 &#8211;

Elements of vector are :20 30 40 50

在上面的例子中,改变向量的值。 因此,向量是可变参考。 在i变量之前使用引用运算符*来获取向量v的值。

更新矢量

当创建向量时,使用push()方法将元素插入到向量中。 push()在向量的末尾插入新元素。

下面来看看一个简单的例子:

fn main()
{
let mut v=Vec::new();
v.push('j');
v.push('a');
v.push('v');
v.push('a');
for i in v
{
print!("{}",i);
}
}

执行上面示例代码,得到以下结果 &#8211;

java

在上面的示例中,push()函数用于在运行时将元素插入向量中。 向量v是可变的,这样也可以改变向量的值。

删除矢量

当向量超出范围时,它会自动删除或从内存中释放。通过一个简单的场景来理解这一点:

fn main()
{
let v = !vec[30,40,50];
} # => v 在这里被释放,因为它超出了范围。

在上面的场景中,当向量超出范围时释放向量意味着将移除向量中存在的所有元素。

使用Enum存储多种类型

向量可以存储相同类型的元素,这是向量的一个很大的缺点。 枚举是一种自定义数据类型,它包含相同枚举名称下的各种类型的变体。 当想要将元素存储在不同类型的向量中时,使用枚举类型。

下面通过一个例子来理解这一点:

#[derive(Debug)]
enum Values {
A(i32),
B(f64),
C(String),
}
fn main()
{
let v = vec![Values::A(5),
Values::B(10.7),Values::C(String::from("Yiibai"))];
for i in v
{
println!("{:?}",i);
}
}

执行上面示例代码,得到以下结果 &#8211;

A(5)
B(10.7)
C(Yiibai)

在向量中使用枚举的优点:

  • Rust在编译时知道向量元素的类型,以确定每个元素需要多少内存。
  • 当向量由一个或多个类型的元素组成时,对元素执行的操作将导致错误,但使用带有匹配的枚举将确保可以在运行时处理每个可能的情况。

    推荐阅读
    • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
    • linux进阶50——无锁CAS
      1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
    • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
    • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
    • Java容器中的compareto方法排序原理解析
      本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
    • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
    • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
    • JavaSE笔试题-接口、抽象类、多态等问题解答
      本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
    • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
    • Python正则表达式学习记录及常用方法
      本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
    • Python爬虫中使用正则表达式的方法和注意事项
      本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
    • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
    • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
    • 带添加按钮的GridView,item的删除事件
      先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
    • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
    author-avatar
    叹号妈咪_790
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有