码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Rust】——Vector集合


    🎃个人专栏:

    🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客

    🐳Java基础:Java基础_IT闫的博客-CSDN博客

    🐋c语言:c语言_IT闫的博客-CSDN博客

    🐟MySQL:数据结构_IT闫的博客-CSDN博客

    🐠数据结构:​​​​​​数据结构_IT闫的博客-CSDN博客

    💎C++:C++_IT闫的博客-CSDN博客

    🥽C51单片机:C51单片机(STC89C516)_IT闫的博客-CSDN博客

    💻基于HTML5的网页设计及应用:基于HTML5的网页设计及应用_IT闫的博客-CSDN博客​​​​​​

    🥏python:python_IT闫的博客-CSDN博客

    🐠离散数学:离散数学_IT闫的博客-CSDN博客

    ​​​​​​🥽Linux:​​​​Linux_Y小夜的博客-CSDN博客

    🚝Rust:Rust_Y小夜的博客-CSDN博客

    欢迎收看,希望对大家有用!

    目录

    🎯创建vector

    🎯更新Vector

    🎯删除Vector

     🎯读取Vector元素

    🎯所有权和借用规则

    🎯使用enum来存储多种数据类型


    第一个类型是 Vec,也被称为 vector:

    • 有标准库提供。
    • 允许我们在一个单独的数据结构中储存多于一个的值。
    • 它在内存中彼此相邻地排列所有的值。
    • vector 只能储存相同类型的值。

    🎯创建vector

    为了创建一个新的空 vector,可以调用 Vec::new 函数

        let v: Vec<i32> = Vec::new();
    

            因为没有向这个 vector 中插入任何值,Rust 并不知道我们想要储存什么类型的元素。这是一个非常重要的点。vector 是用泛型实现的。

            为了方便 Rust 提供了 vec! 宏,这个宏会根据我们提供的值来创建一个新的 vector。

        let v = vec![1, 2, 3];
    

            因为我们提供了 i32 类型的初始值,Rust 可以推断出 v 的类型是 Vec,因此类型注解就不是必须的。接下来让我们看看如何修改一个 vector。

    🎯更新Vector

    对于新建一个 vector 并向其增加元素,可以使用 push 方法

    1. let mut v = Vec::new();
    2. v.push(5);
    3. v.push(6);
    4. v.push(7);
    5. v.push(8);

            如果想要能够改变它的值,必须使用 mut 关键字使其可变。放入其中的所有值都是 i32 类型的,而且 Rust 也根据数据做出如此判断,所以不需要 Vec 注解。

    🎯删除Vector

    类似于任何其他的 struct,vector 在其离开作用域时会被释放

    1. {
    2. let v = vec![1, 2, 3, 4];
    3. }

     🎯读取Vector元素

    有两种方法引用 vector 中储存的值:

    • 通过索引
    • 使用 get 方法。
    1. let v = vec![1, 2, 3, 4, 5];
    2. let third: &i32 = &v[2];
    3. println!("The third element is {third}");
    4. let third: Option<&i32> = v.get(2);
    5. match third {
    6. Some(third) => println!("The third element is {third}"),
    7. None => println!("There is no third element."),
    8. }

            这里有几个细节需要注意:

    • 我们使用索引值 2 来获取第三个元素,因为索引是从数字 0 开始的。
    • 使用 & 和 [] 会得到一个索引位置元素的引用。
    • 当使用索引作为参数调用 get 方法时,会得到一个可以用于 match 的 Option<&T>。

    1. let v = vec![1, 2, 3, 4, 5];
    2. let does_not_exist = &v[100];
    3. let does_not_exist = v.get(100);

            当运行这段代码,你会发现对于第一个 [] 方法,当引用一个不存在的元素时 Rust 会造成 panic。这个方法更适合当程序认为尝试访问超过 vector 结尾的元素是一个严重错误的情况,这时应该使程序崩溃。

            当 get 方法被传递了一个数组外的索引时,它不会 panic 而是返回 None。当偶尔出现超过 vector 范围的访问属于正常情况的时候可以考虑使用它。接着你的代码可以有处理 Some(&element) 或 None 的逻辑。

    🎯所有权和借用规则

    不能在相同作用域中同时存在可变和不可变引用。

    1. let mut v = vec![1, 2, 3, 4, 5];
    2. let first = &v[0];
    3. v.push(6);
    4. println!("The first element is: {first}");

            当我们获取了 vector 的第一个元素的不可变引用并尝试在 vector 末尾增加一个元素的时候,如果尝试在函数的后面引用这个元素是行不通的。

    🎯遍历Vector中的值

    使用 for 循环来获取 i32 值的 vector 中的每一个元素的不可变引用并将其打印

    1. let v = vec![100, 32, 57];
    2. for i in &v {
    3. println!("{i}");
    4. }

    我们也可以遍历可变 vector 的每一个元素的可变引用以便能改变它们:

    1. let mut v = vec![100, 32, 57];
    2. for i in &mut v {
    3. *i += 50;
    4. }

    🎯使用enum来存储多种数据类型

            vector 只能储存相同类型的值。这是很不方便的;绝对会有需要储存一系列不同类型的值的用例。幸运的是,枚举的成员都被定义为相同的枚举类型,所以当需要在 vector 中储存不同类型值时,我们可以定义并使用一个枚举!

    1. enum SpreadsheetCell {
    2. Int(i32),
    3. Float(f64),
    4. Text(String),
    5. }
    6. let row = vec![
    7. SpreadsheetCell::Int(3),
    8. SpreadsheetCell::Text(String::from("blue")),
    9. SpreadsheetCell::Float(10.12),
    10. ];

            Rust 在编译时就必须准确的知道 vector 中类型的原因在于它需要知道储存每个元素到底需要多少内存。第二个好处是可以准确的知道这个 vector 中允许什么类型。如果 Rust 允许 vector 存放任意类型,那么当对 vector 元素执行操作时一个或多个类型的值就有可能会造成错误。

  • 相关阅读:
    ceph的组件和功能以及部署三个节点的ceph集群
    java 身份证号码验证
    几个常用的开源数学公式生成软件
    手把手教你用C语言写出“走迷宫”小游戏(能看懂文字就会自己敲系列)
    Linux:Gitlab:16.9.2 创建用户及项目仓库基础操作(2)
    直播回顾:Coremail校园邮件安全防护交流会暨新技术应用分享
    【C++】vector
    DGL安装教程
    智能油井在线监控解决方案,第一时间掌握所有动态
    Vxlan网络和flannel记录
  • 原文地址:https://blog.csdn.net/shsjssnn/article/details/136233945
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号