![](/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.