向量是一種單一資料結構,可以在記憶體中彼此相鄰地儲存多個值。 當有一個專案列表(例如:購物車中的資料項)時,向量很有用。
要點:
Vec <T>
表示。Vec <T>
由標準庫提供,它可以儲存任何型別的資料,其中T
確定向量的型別。Vec <T>
:當向量保持特定型別時,它在角括號中表示。
可以使用Vec::new()
函式建立向量,參考以下範例程式碼 :
Let v : Vec<i32> = Vec::new();
在上面的宣告中,v
是i32
型別的向量,它是使用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>
型別的值。
看下面一個範例程式碼 -
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);
}
執行上面範例程式碼,得到以下結果 -
Fourth element of a vector is 50
在上面的範例中,get()
方法用於存取向量的第四個元素。
當使用[]
運算子存取不存在的元素時,它會導致程式發生混亂。 因此,當嘗試存取不存在的元素時,程式就會崩潰。 如果嘗試使用get()
方法存取該元素,則它返回None
而不會發生崩潰。
通過下面一個例子來理解這一點:
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);
}
執行上面範例程式碼,得到以下結果 -
None
fn main()
{
let v =vec![20,30,40,50];
println!("{}",v[8]);
}
執行上面範例程式碼,得到以下結果 -
如果想要存取向量的每個元素,那麼可以疊代向量的元素,而不是使用索引來存取向量的特定元素。
可以使用for
迴圈來迭代可變或不可變的參照。
下面來看一個不可變參照的簡單範例:
fn main()
{
let v =vec![20,30,40,50];
print!("Elements of vector are :");
for i in v
{
print!("{} ",i);
}
}
執行上面範例程式碼,得到以下結果 -
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);
}
}
執行上面範例程式碼,得到以下結果 -
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);
}
}
執行上面範例程式碼,得到以下結果 -
java
在上面的範例中,push()
函式用於在執行時將元素插入向量中。 向量v
是可變的,這樣也可以改變向量的值。
當向量超出範圍時,它會自動刪除或從記憶體中釋放。通過一個簡單的場景來理解這一點:
fn main()
{
let v = !vec[30,40,50];
} # => v 在這裡被釋放,因為它超出了範圍。
在上面的場景中,當向量超出範圍時釋放向量意味著將移除向量中存在的所有元素。
向量可以儲存相同型別的元素,這是向量的一個很大的缺點。 列舉是一種自定義資料型別,它包含相同列舉名稱下的各種型別的變體。 當想要將元素儲存在不同型別的向量中時,使用列舉型別。
下面通過一個例子來理解這一點:
#[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);
}
}
執行上面範例程式碼,得到以下結果 -
A(5)
B(10.7)
C(Yiibai)
在向量中使用列舉的優點: