![](/img/trans.png)
[英]How can I convert a string of numbers to an array or vector of integers in 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()
运行迭代。如果:
您可以写入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
分配一个新的Vec
而vec_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.