Vec,也稱爲vector。它允許我們在一個單獨的數據結構中存儲一系列相同類型的值,它們在內存中彼此相鄰的排列所有的值。
vector VS 數組
不同點
- vector是存儲在堆上,數組存儲在棧上
- vector的長度是動態增長的,數組一旦定義,其長度就不能再次更改了
- vector是標準庫中用泛型實現的,數組是rust語言的原生內建類型
相同點:
- 存儲多個相同類型的值,它們在內存中彼此相鄰
- OS分配完內存之後默認都會標記這片內存只讀不寫[值不可變],如果想要修改元素值[內存可讀可寫],必須使用mut
- 都只能在{}內部使用,不能再函數外面聲明
- 如果不覆蓋的話,作用域均爲從聲明開始到下一個}結束。一旦離開作用域,它們的值和變量名均會被銷燬
- 在使用for in循環時,如果想要修改vector/array的元素,必須使用*解引用取出元素值才能修改
vector
初始化
vector有兩種初始化方法:使用Vec::new();函數或者使用Vec!宏
fn main() {
//1:調用 Vec::new函數新建一個空的 vector 來儲存 i32 類型的值
let mut v:Vec<i32> = Vec::new();
v.push(5);
println!("{:?}",v);
/*
{} 需要被顯示的類型實現 Display Trait
{:?} 需要被顯示的類型實現 Debug Trait
*/
//2: vec!宏使用初始值來創建一個 Vec
let v = vec![1, 2, 3];// v 離開作用域並被丟棄, 然後新建一個vector名字也叫做v
println!("{:?}", v)
let v = vec![0;10];
println!("{:?}", v) //[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
println!("{:?}", v[0]) //可以使用索引訪問vector中的值
} // v 離開作用域並被丟棄
引用元素:&v[index] 對比 v.get(index)
1、&v[index]返回一個引用, v.get(index)方法返回一個 Option<&T>。
fn main() {
let v = vec![1, 2, 3, 4, 5];
let third:&i32 = &v[2];
let gthird:Option<&i32> = v.get(2);
println!("{}, {:?}", third, gthird);
}
2、如果越界訪問的話,&v[index]會panic,v.get(index)會返回None,所以如果要引用vector的元素,建議使用v.get(index)
fn main() {
let v = vec![1, 2, 3, 4, 5];
// let third:&i32 = &v[100]; //thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 100'
let gthird:Option<&i32> = v.get(100);
println!("{:?}", gthird);
}
循環修改元素
最好使用引用來循環遍歷元素。引用獲取值得使用權而不是控制權
fn main() {
let mut v = vec![1, 2, 3, 4, 5];
for i in &mut v{
*i += 100; //爲了修改可變引用所指向的值,在使用 += 運算符之前必須使用解引用運算符(*)獲取 i 中的值
}
for i in &v{
println!("{}", i)
}
let mut arr = [1, 2, 3];
for i in &mut arr{
*i += 100;
}
for i in &arr{
println!("{}", i)
}
}
如果不使用元素的引用來遍歷元素。直接遍歷的話,vector將會失去那一片內存的控制權
fn main() {
let v = vec![1, 2, 3, 4, 5];
for i in v{ //v將失去這塊內存得所有權
println!("{}", i)
}
for i in v{ //error[E0382]: use of moved value: `v`
println!("{}", i)
}
}
存儲不同類型的元素:vector結合enum
enum SpreedsheetCell{
Int(i32),
Float(f64),
Text(String),
}
let row = vec![
SpreedsheetCell::Int(3),
SpreedsheetCell::Text(String::from("blue")),
SpreedsheetCell::Float(11.12),
];
參考:https://kaisery.gitbooks.io/rust-book-chinese/content/content/Vectors.html
https://kaisery.gitbooks.io/rust-book-chinese/content/content/Vectors.html