Rust學習(16):Rust中的集合類型之vectors

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章