當前位置: 妍妍網 > 碼農

Rust 中使用向量儲存值列表

2024-07-29碼農

向量( Vec<T> )是 Rust 中最常用的集合型別之一,用於儲存同一型別的值列表。它們在處理檔行、購物車商品價格或其他需要有序儲存數據的場景中非常有用。

建立向量

您可以使用 Vec::new() 函式建立一個空向量,或者使用 vec! 宏建立一個包含初始值的向量:

fnmain() {
// 建立一個空向量,用於儲存 i32 型別的值
let v: Vec<i32> = Vec::new();
// 建立一個包含初始值的向量
let v = vec![123];
}

Rust 可以根據初始值推斷出向量的型別,因此通常不需要顯式型別註解。

更新向量

可以使用 push 方法將元素添加到向量末尾:

fnmain() {
letmut v = Vec::new();
v.push(5);
v.push(6);
v.push(7);
v.push(8);
}

請註意,為了修改向量,需要使用 mut 關鍵字將其聲明為可變的。

讀取向量元素

可以透過索引或 get 方法存取向量中的元素:

fnmain() {
let v = vec![12345];
// 使用索引存取元素
let third: &i32 = &v[2];
println!("第三個元素是:{}", third);
// 使用 get 方法存取元素
let third: Option<&i32> = v.get(2);
match third {
Some(third) => println!("第三個元素是:{}", third),
None => println!("沒有第三個元素。"),
}
}

向量從 0 開始索引,因此索引 2 對應第三個元素。 get 方法返回一個 Option<&T> ,如果索引有效,則包含對元素的參照,否則為 None

處理無效索引

當使用索引存取向量元素時,如果索引超出範圍,程式會 panic。使用 get 方法可以避免 panic,因為它會返回 None

fnmain() {
let v = vec![12345];
// 使用索引存取超出範圍的元素會導致 panic
let does_not_exist = &v[100];
// 使用 get 方法存取超出範圍的元素返回 None
let does_not_exist = v.get(100);
}

選擇使用哪種方法取決於您的程式邏輯,如果出現超出範圍的索引是不可接受的錯誤,則使用 [] 方法;如果超出範圍的索引是可能發生的正常情況,則使用 get 方法。

借用規則和向量

在對向量進行操作時,需要遵守 Rust 的借用規則。例如,如果持有對向量元素的不可變參照,則無法修改向量本身。

fnmain() {
letmut v = vec![12345];
// 持有對第一個元素的不可變參照
let first = &v[0];
// 嘗試向向量添加元素會引起錯誤,因為 v 同時被借用了
v.push(6);
println!("第一個元素是:{}", first);
}

這是因為向量在記憶體中是連續儲存的,添加新元素可能會導致記憶體重新分配,從而使指向舊元素的參照失效。借用規則確保了程式的安全性和正確性。

叠代向量元素

可以使用 for 迴圈叠代向量中的元素:

fnmain() {
let v = vec![1003257];
// 叠代不可變參照
for i in &v {
println!("{i}");
}
// 叠代可變參照
letmut v = vec![1003257];
for i in &mut v {
*i += 50;
}
}

使用 &mut 可以獲取對元素的可變參照,並對元素進行修改。

使用列舉儲存不同型別

向量只能儲存同一型別的元素,但可以使用列舉來儲存不同型別的元素。

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

列舉的每個變體都屬於同一個型別,因此可以將列舉儲存在向量中,從而間接儲存不同型別的元素。

向量銷毀

當向量超出作用域時,它會被銷毀,其包含的元素也會被銷毀。借用規則確保了在向量銷毀之前,不會有任何參照指向其元素。

fnmain() {
{
let v = vec![1234];
// 使用 v
// v 超出作用域,被銷毀
}

總結

向量是 Rust 中非常強大的集合型別,它提供了多種方法來儲存、存取和修改數據。透過理解向量的工作原理以及 Rust 的借用規則,您可以有效地使用向量來構建各種數據結構和演算法。

擴充套件

除了本篇文章中介紹的內容之外,向量還提供了許多其他有用的方法,例如 pop insert remove 等。您可以在 Rust 官方文件中找到關於向量 API 的詳細介紹。

此外,您還可以學習其他集合型別,例如 String HashMap 等,它們在不同的場景下都有獨特的優勢。

學習 Rust 集合型別是掌握 Rust 編程的關鍵,希望本文能幫助您更好地理解和使用向量。

文章精選

「Rust