Rust 數據結構:Vector

Rust 數據結構:Vector

  • Rust 數據結構:Vector
    • 創建數組
    • 更新數組
      • 插入元素
      • 刪除元素
    • 獲取數組中的元素
    • 迭代數組中的值
    • 使用枚舉存儲多個類型
    • 刪除一個數組會刪除它的元素

Rust 數據結構:Vector

vector 來自標準庫,在內存中連續存儲相同類型的多個值。

創建數組

要創建一個新的空 vector,調用 Vec::new 函數,并指名類型。

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

Rust 方便地提供了 vec! 宏,它創建具有初始值的Vec<T>,無需類型注釋。

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

整數類型是 i32,因為這是默認的整數類型,Rust可以推斷出 v 的類型是 Vec<i32>。

更新數組

插入元素

要創建一個 vector 并向其中添加元素,可以使用 push 方法。

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

與任何變量一樣,如果我們希望能夠改變它的值,我們需要使用 mut 關鍵字使其可變。

我們放在里面的數字都是 i32 類型的,Rust 從數據中推斷出這一點,所以我們不需要 Vec<i32> 注釋。

刪除元素

pop 方法刪除并返回最后一個元素。

獲取數組中的元素

有兩種方法可以引用存儲在 vector 中的值:通過索引或使用 get 方法。

    let v = vec![1, 2, 3, 4, 5];let third: &i32 = &v[2];println!("The third element is {third}");let third: Option<&i32> = v.get(2);match third {Some(third) => println!("The third element is {third}"),None => println!("There is no third element."),}

使用 & 和 [] 為我們提供了對索引值處元素的引用。當使用 get 方法將索引作為參數傳遞時,會得到一個 Option<&T>,可以與 match 一起使用。

注意,索引值不能超出現有元素范圍。如果直接訪問超出范圍的元素,程序會報錯。當 get 方法被傳遞給向量之外的索引時,它會返回 None 而不會報錯。

當程序有一個有效的引用時,借閱檢查器執行所有權和借閱規則,以確保這個引用和對vector內容的任何其他引用保持有效。回想一下在同一作用域中不能有可變引用和不可變引用的規則。該規則適用于下面的示例:

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

我們保存了一個指向 vector 中第一個元素的不可變引用,并嘗試在末尾添加一個元素。如果我們稍后還試圖在函數中引用該元素,則該程序將無法工作。

為什么對第一個元素的引用要關心 vector 末尾的變化?這個錯誤是由于 vector 的工作方式造成的:因為 vector 將值放在內存中相鄰的位置,如果沒有足夠的空間將 vector 當前存儲的所有元素放在相鄰的位置,則在 vector 的末尾添加新元素可能需要分配新的內存并將舊元素復制到新的空間中。在這種情況下,對第一個元素的引用將指向已釋放的內存。同一作用域中不能有可變引用和不可變引用的規則防止了這種情況。

迭代數組中的值

使用 for 循環可以遍歷所有元素,而不是一次使用索引訪問一個元素。

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

還可以遍歷對可變向量中每個元素的可變引用,以便對所有元素進行修改。

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

要更改可變引用所引用的值,必須先使用 * 解引用操作符獲 取i 中的值,然后才能使用 += 操作符。

由于借用檢查器的規則,對 vector 進行迭代(無論是不可變還是可變)都是安全的。如果試圖在 for 循環體中插入或刪除項,就會報錯。

使用枚舉存儲多個類型

vector 只能存儲相同類型的值。這可能很不方便。我們可以定義一個枚舉,它的變體將保存不同的值類型,所有的枚舉變體將被認為是相同的類型:枚舉的類型。然后,可以創建一個 vector 容器來保存枚舉,從而最終保存不同的類型。

    enum SpreadsheetCell {Int(i32),Float(f64),Text(String),}let row = vec![SpreadsheetCell::Int(3),SpreadsheetCell::Text(String::from("blue")),SpreadsheetCell::Float(10.12),];

刪除一個數組會刪除它的元素

當 vector 超出作用域時,它將被釋放。

當 vector 被刪除時,它的所有內容也被刪除,這意味著它保存的整數將被清理。借用檢查器確保僅在 vector 本身有效時才使用對 vector 內容的任何引用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905677.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習入門:深度學習(完結)

目錄 1、加深網絡1.1 向更深的網絡出發1.2 進一步提高識別精度1.3 加深層的動機 2、深度學習的小歷史2.1 ImageNet2.2 VGG2.3 GoogleNet2.4 ResNet 3、深度學習的高速化3.1 需要努力解決的問題3.2 基于GPU的高速化3.3 分布式學習3.4 運算精度的位數縮減 4、深度學習的應用案例4…

如何利用 Python 爬蟲按關鍵字搜索京東商品:實戰指南

在電商領域&#xff0c;京東作為國內知名的電商平臺&#xff0c;擁有海量的商品數據。通過 Python 爬蟲技術&#xff0c;我們可以高效地按關鍵字搜索京東商品&#xff0c;并獲取其詳細信息。這些信息對于市場分析、選品上架、庫存管理和價格策略制定等方面具有重要價值。本文將…

?JMeter聚合報告中的任務數和并發數區別

?JMeter聚合報告中的任務數和并發數有本質的區別。? 任務數&#xff08;樣本數&#xff09; 任務數或樣本數是指在性能測試中發出的請求數量。例如&#xff0c;如果模擬20個用戶&#xff0c;每個用戶發送100次請求&#xff0c;那么總的任務數或樣本數就是2000次請求? 并發…

Java 框架配置自動化:告別冗長的 XML 與 YAML 文件

在 Java 開發領域&#xff0c;框架的使用極大地提升了開發效率和系統的穩定性。然而&#xff0c;傳統框架配置中冗長的 XML 與 YAML 文件&#xff0c;卻成為開發者的一大困擾。這些配置文件不僅書寫繁瑣&#xff0c;容易出現語法錯誤&#xff0c;而且在項目規模擴大時&#xff…

OpenShift AI - 用 ModelCar 構建容器化模型,提升模型彈性擴展速度

《OpenShift / RHEL / DevSecOps 匯總目錄》 說明&#xff1a;本文已經在 OpenShift 4.18 OpenShift AI 2.19 的環境中驗證 文章目錄 什么是 ModelCar構建模型鏡像在 OpenShift AI 使用模型鏡像部署模型擴展速度對比 參考 什么是 ModelCar KServe 典型的模型初始化方法是從 S…

C#+WPF+prism+materialdesign創建工具主界面框架

代碼使用C#WPFprismmaterialdesign創建工具主界面框架 主界面截圖&#xff1a;

在選擇合適的實驗室鐵地板和鑄鐵試驗平板,幫分析?

鑄鐵測試底板是一種采用鑄鐵材料經過加工制成的基準測量工具&#xff0c;主要用于工業檢測、機械加工和實驗室等高精度要求的場合。其核心功能是為各類測量、檢驗、裝配工作提供穩定的水平基準面&#xff0c;確保測量數據的準確性和一致性。 一、鑄鐵測試底板的基本特性 1.材質…

C++匿名函數

C 中的匿名函數&#xff08;Lambda 表達式&#xff09;是 C11 引入的一項重要特性&#xff0c;它允許你在需要的地方定義一個臨時的、無名的函數對象&#xff0c;使代碼更加簡潔和靈活。 1. 基本語法 Lambda 表達式的基本結構&#xff1a; [capture list](parameter list) -…

LabVIEW機械振動信號分析與故障診斷

利用 LabVIEW 開發機械振動信號分析與故障診斷系統&#xff0c;融合小波變換、時頻分布、高階統計量&#xff08;雙譜&#xff09;等先進信號處理技術&#xff0c;實現對齒輪、發動機等機械部件的非平穩非高斯振動信號的特征提取與故障診斷。系統通過虛擬儀器技術將理論算法轉化…

湖北理元理律師事務所:債務優化如何實現“減負不降質”?

在債務壓力普遍加劇的背景下&#xff0c;如何平衡債務清償與生活質量&#xff0c;成為個人及企業關注的焦點。湖北理元理律師事務所基于多年實務經驗&#xff0c;總結出一套“法律財務”雙軌制債務優化模型&#xff0c;其核心在于通過科學規劃&#xff0c;幫助債務人在法律框架…

多鏈互操作性標準解析:構建下一代區塊鏈互聯生態

引言 在區塊鏈技術快速演進的今天&#xff0c;“多鏈宇宙”已成為不可逆的趨勢。然而&#xff0c;鏈與鏈之間的孤立性導致流動性割裂、開發成本高昂和用戶體驗碎片化。互操作性標準的制定&#xff0c;正是打破這一僵局的核心鑰匙。本文將深入探討主流互操作性協議的技術架構、…

電腦開機提示按f1原因分析及解決方法(6種解決方法)

經常有網友問到一個問題,我電腦開機后提示按f1怎么解決?不管理是臺式電腦,還是筆記本,都有可能會遇到開機需要按F1,才能進入系統的問題,引起這個問題的原因比較多,今天小編在這里給大家列舉了比較常見的幾種電腦開機提示按f1的解決方法。 電腦開機提示按f1原因分析及解決…

講講git 和svn

講講git 和svn 目錄Git到底是什么&#xff1f;它該怎末用&#xff1f;核心概念基礎操作1. 倉庫的創建2. 文件的提交工作流程3. 分支管理4. 遠程倉庫操作 進階操作實際應用建議**基本用法****常用命令的幫助示例****幫助文檔的結構****替代方法****練習建議****核心概念****與Gi…

【行為型之中介者模式】游戲開發實戰——Unity復雜系統協調與通信架構的核心秘訣

文章目錄 &#x1f54a;? 中介者模式&#xff08;Mediator Pattern&#xff09;深度解析一、模式本質與核心價值二、經典UML結構三、Unity實戰代碼&#xff08;成就系統協調&#xff09;1. 定義中介者接口與同事基類2. 實現具體同事類3. 實現具體中介者4. 客戶端使用 四、模式…

【網工第6版】第10章 網絡規劃和設計②

目錄 ■ 網絡分析與設計 ◆ 網絡規劃設計模型 ◆ 網絡設計的約束因素 ◆ 技術評價 ■ 網絡結構與功能 ◆ 局域網結構類型 ■ 網絡冗余設計 ◆ 網絡冗余設計-備用路徑 ◆ 網絡冗余設計-負載分擔 ■ 廣域網接入技術 ◆ 廣域網接入技術 ◆ 接入和終結設備 ■ 網絡分析…

PowerBI鏈接EXCEL實現自動化報表

PowerBI鏈接EXCEL實現自動化報表 曾經我將工作中一天的工作縮短至2個小時&#xff0c;其中最關鍵的一步就是使用PowerBI鏈接Excel做成一個自動化報表&#xff0c;PowerBI更新源數據&#xff0c;Excel更新報表并且保留報表格式。 以制作一個超市銷售報表為例&#xff0c;簡單敘…

C#.NET 或 VB.NET Windows 窗體中的 DataGridView – 技巧、竅門和常見問題

DataGridView 控件是一個 Windows 窗體控件&#xff0c;它允許您自定義和編輯表格數據。它提供了許多屬性、方法和事件來自定義其外觀和行為。在本文中&#xff0c;我們將討論一些常見問題及其解決方案。這些問題來自各種來源&#xff0c;包括一些新聞組、MSDN 網站以及一些由我…

表記錄的檢索

1.select語句的語法格式 select 字段列表 from 表名 where 條件表達式 group by 分組字段 [having 條件表達式] order by 排序字段 [asc|desc];說明&#xff1a; from 子句用于指定檢索的數據源 where子句用于指定記錄的過濾條件 group by 子句用于對檢索的數據進行分組 ha…

能源設備數據采集

在全球可持續發展目標與環境保護理念日益深入人心的時代背景下&#xff0c;有效管理和優化能源使用已成為企業實現綠色轉型、提升競爭力的關鍵路徑。能源設備數據采集系統&#xff0c;作為能源管理的核心技術支撐&#xff0c;通過對各類能源生產設備運行數據的全面收集、深度分…

【鴻蒙開發】性能優化

語言層面的優化 使用明確的數據類型&#xff0c;避免使用模糊的數據類型&#xff0c;例如ESObject。 使用AOT模式 AOT就是提前編譯&#xff0c;將字節碼提前編譯成機器碼&#xff0c;這樣可以充分優化&#xff0c;從而加快執行速度。 未啟用AOT時&#xff0c;一邊運行一邊進…