如何在 Rust 中循环遍历整数向量?

5
我知道下面的代码有效:

// 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之间是否存在性能差异。
4个回答

4
你可以像操作C指针一样操作i
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 应分配一个新向量,而带有循环的方法则原地修改现有内存,因此在大向量上应该更快。对我来说,v.iter().map(|x| x * 2).collect() 看起来更干净,我会出于可读性的目的使用它。


2

仅仅是为了扩展前面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将改变其借用的数据,而不是接收一个向量并返回一个向量。


2

您需要使用解引用运算符(*),具体可以参考此处

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

1
您可以使用解引用 * 运算符对可变引用进行解引用和突变操作:
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]));
}

playground

{{链接1:游乐场}}


揭示方法1和方法2之间是否存在任何性能差异。 vec_loop_1会分配一个新的Vec,而vec_loop_2则不会。后者将更快并且使用更少的内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接