vec的基本使用

創建向量有幾種方式:

  • Vec::new()創建空的vec
  • Vec::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);
}
}