一、綱要
定義
1. new Vec::new();
2. 採用宏 vec![1, 2, 3];
操作
0.讀取 索引語法或者 get 方法 ,注意索引從0開始. vec[0]或者vec.get(0)
vec[i] 不會改變所有權,但如果發生越界,則會導致程式終止
get(i) 返回的是一個Option型別,同樣不會改變所有權。越界放回None
rust也要照顧到大家的習慣,不要讀取一個索引就改變所有權。如果是那樣實在太麻煩了。
1.新增 push ,新增都尾部
2.修改 vec[0] = 10;
3.刪除 pub,remove
4.遍歷
a. 簡單語法 for i in &vec {}
b. 迭代器 for i in vec.iter() {}
c. for+get for i in 0..vec.len() { let e = &v[i]; }
向量和列舉
利用列舉的特性,而已讓向量儲存不同型別的資料,這是因為列舉允許不同成員有不同型別的資料。
應該沒有什麼人會這麼搞吧? rust還是有對應措施,使得有基本上可以匹配java的List<Object>的型別存在。
二、示例
fn main() { //1.0 定義 let mut height_arr: Vec<i32> = Vec::new(); //1.1 宏定義 let mut arr = vec![1, 2, 3]; //2.0 新增元素 height_arr.push(130); height_arr.push(135); height_arr.push(140); height_arr.push(142); height_arr.push(145); height_arr.push(150); height_arr.push(160); println!("{:?} 共有{}個元素", height_arr,height_arr.len()); //2.1 訪問具體元素- 常規的方法不會導致所有權轉移 let a1 = height_arr[0]; let a2= height_arr.get(1).unwrap(); println!("a1={},a2={}", a1,a2); //2.2 使用索引訪問,測試越界訪問。這會導致程式異常,並終止 //如果是get越界,會返回None //thread 'main' panicked at xx.rs:52:24: //index out of bounds: the len is 7 but the index is 10 println!("訪問越界元素"); //let a3 = height_arr[10]; //這會導致程式異常,並終止 let a3= height_arr.get(10); if let None = a3 { println!("不存在第11個元素:{}","None"); } //3.0 修改元素 height_arr[0] = 131; //4.0 刪除元素 height_arr.pop(); //移除最後一個元素 println!("{:?} 移除一個後,還有{}個元素", height_arr,height_arr.len()); //5.0 遍歷 //5.1 簡單語法 println!("遍歷一、簡單語法遍歷向量,所有權轉移"); //for i in height_arr 這樣會導致所有權轉移 //這裡必須使用引用,否則用過之後,所有都轉移了。後續要是再使用則會報錯 for i in &height_arr { println!("{}", i); } //5.2 迭代器-這個方式不會改變所有權,後面可以繼續使用原來的變數 println!("遍歷二、迭代器遍歷向量,所有權不轉移"); for i in height_arr.iter() { println!("{}", i); } //5.3 for+get // 索引法和get方法都不會導致所有權轉移,所以可以繼續使用原來的變數 println!("遍歷三、for+索引遍歷向量,所有權不轉移"); for i in 0..height_arr.len() { let e = height_arr[i]; let b = height_arr.get(i); println!("{},{:?}", e,b); } }
rust-script 執行下,結果如下:
三、小結
1.長度可變,容量自動管理
2.元素型別必須相同
3.可存放任何型別資料,包括引用
4.某種情況下,類似java的List,但比java的List差,因為java的List可以儲存不同型別成員
5. 向量具有許多的方法,需要自行去看api文件,無法一一列出,也沒有必要。
rust的向量的api文件 https://doc.rust-lang.org/std/vec/struct.Vec.html