簡體   English   中英

如何遍歷 Rust 中的整數向量?

[英]How to loop over a vector of integers in Rust?

我知道下面的代碼有效:

// method 1
fn vec_loop(mut v: Vec<i32>) -> Vec<i32> {
  v.iter().map(|x| x * 2).collect()
}

但是,我想知道是否可以這樣做:

// method 2
fn vec_loop(mut v: Vec<i32>) -> Vec<i32> {
  for i in v.iter_mut() {
    // TODO: Fill this up so that each element in the Vec `v` is multiplied by two.
  }
  v
}

到目前為止,我一直無法使用iter_mut()運行迭代。如果:

  1. 有人可以闡明如何以這種方式運行代碼。
  2. 深入了解方法 1 和方法 2 之間是否存在任何性能差異。

您可以寫入i ,例如 C 指針:

fn vec_loop(mut v: Vec<i32>) -> Vec<i32> {
  for i in v.iter_mut() {
    *i *= 2;
  }
  v
}

fn main() {
    let mut vec = vec![1,2,3,4,5];
    
    println!("{:?}", vec_loop(vec));
}

至於性能,您可以隨時測量它,此外, collect應該分配一個新向量,而使用循環的方法會就地修改現有的 memory,因此在大向量上應該更快。 對我來說, v.iter().map(|x| x * 2).collect()看起來更干凈,我會用它來提高可讀性。

您必須使用取消引用運算符( * ):

fn vec_loop(mut v: Vec<i32>) -> Vec<i32> {
    for i in v.iter_mut() {
      *i *= 2;
    }
    v
}

您可以使用 deref *運算符取消引用和改變可變引用:

fn vec_loop_1(v: Vec<i32>) -> Vec<i32> {
    v.into_iter().map(|x| x * 2).collect()
}

fn vec_loop_2(mut v: Vec<i32>) -> Vec<i32> {
    for i in v.iter_mut() {
        *i *= 2;
    }
    v
}

fn main() {
    assert_eq!(vec_loop_1(vec![1, 2, 3]), vec![2, 4, 6]);
    assert_eq!(vec_loop_2(vec![1, 2, 3]), vec![2, 4, 6]);
    assert_eq!(vec_loop_1(vec![1, 2, 3]), vec_loop_2(vec![1, 2, 3]));
}

操場


深入了解方法 1 和方法 2 之間是否存在任何性能差異。

vec_loop_1分配一個新的Vecvec_loop_2沒有。 后者會更快並且使用更少的 memory。

只是為了擴展 pretzelhammer 的先前答案,您也可以在不返回任何數據的情況下改變原始向量。

fn vec_loop_1(v: Vec<i32>) -> Vec<i32> {
    v.iter().map(|x| x * 2).collect()
}

fn vec_loop_2(mut v: Vec<i32>) -> Vec<i32> {
    for i in v.iter_mut() {
        *i *= 2;
    }
    v
}

fn vec_loop_3(v: &mut Vec<i32>) {
    for i in v.iter_mut() {
        *i *= 2;
    }
}

fn main() {
    assert_eq!(vec_loop_1(vec![1, 2, 3]), vec![2, 4, 6]);
    assert_eq!(vec_loop_2(vec![1, 2, 3]), vec![2, 4, 6]);
    assert_eq!(vec_loop_1(vec![1, 2, 3]), vec_loop_2(vec![1, 2, 3]));
    let mut new_vec = vec![1, 2, 3];
    vec_loop_3(&mut new_vec);
    assert_eq!(new_vec, vec![2, 4, 6]);
}

vec_loop_3 將改變其借來的數據,而不是接收一個向量並返回一個向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM