vec的基本使用
創建向量有幾種方式:
Vec::new()
創建空的vecVec::with_capacity()
創建空的vec,並將其容量設置為指定的數量vec![]
宏創建並初始化vec(中括號可以換為小括號或大括號)vec![v;n]
創建並初始化vec,共n個元素,每個元素都初始化為v
fn main(){ let mut v1 = Vec::new(); // 追加元素時,將根據所追加的元素推導v1的數據類型Vec<i32> v1.push(1); // push()向vec尾部追加元素 v1.push(2); v1.push(3); v1.push(4); assert_eq!(v1, [1,2,3,4]) // vec可以直接和數組進行比較 // v2的類型推導為:Vec<i32> let v2 = vec![1,2,3,4]; assert_eq!(v2, [1,2,3,4]); let v3 = vec!(3;4); // 等價於vec![3,3,3,3] assert_eq!(v3, [3,3,3,3]); // 創建容量為10的空vec let mut v4 = Vec::with_capacity(10); v4.push(33); }
訪問和遍歷vec
可以使用索引來訪問vec中的元素。索引越界訪問時,將在運行時panic報錯。
索引是usize類型的值,因此不接受負數索引。
fn main(){ let v = vec![11,22,33,44]; let n: usize = 3; println!("{},{}", v[0], v[n]); // 越界,報錯 // 運行錯誤而非編譯錯誤,因為運行期間才知道vec長度 // println!("{}", v[9]); }
如果不想要在越界訪問vec時panic中斷程序,可使用:
get()
來獲取指定索引處的元素引用或範圍內元素的引用,如果索引越界,返回None
。get_mut()
來獲取元素的可變引用或範圍內元素的可變引用,如果索引越界,返回None
。
這兩個方法的返回值可能是所取元素的引用,也可能是None
,此處不對None
展開介紹,相關的細節要留到Option
類型中介紹。這裡只需要知道,當所調用函數的返回值可能是一個具體值,也可能是None時,需要對這兩種可能的返回值進行處理。比較簡單的一種處理方式是在該函數返回結果上使用unwrap()
方法:當成功返回具體值時,unwrap()將返回該值,當返回None時, unwrap()將panic報錯退出。
例如:
fn main(){ let v = [11,22,33,44]; // 取得index=3處元素,成功,於是unwrap()提取得到44 let n = v.get(3).unwrap(); println!("{}", n); // 取得index=4處元素,失敗,於是panic報錯 // let nn = v.get(4).unwrap(); }
另外,Vec是可迭代的,可以直接使用for x in vec {}
來遍歷vec。
#![allow(unused)] fn main() { let v = vec![11,22,33,44]; for i in v { println!("{}", i); } }