繁体   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