gpt4 book ai didi

vector - 如何在 Rust 中将相同的整数添加到向量的每个元素?

转载 作者:行者123 更新时间:2023-11-29 08:28:20 24 4
gpt4 key购买 nike

在 Python 中,如果我有一个列表并想向每个元素添加 10,我会这样做:

bar = [2,4,5,6,7]
bar = [x + 10 for x in bar]

结果:[12,14,15,16,17]。这在 Rust 中如何实现?执行 for 循环并遍历每个向量元素的唯一方法是什么?

最佳答案

Rust 的方法与 Python 非常相似:使用迭代器!与 Python 的列表理解大致等价的是 iter::map获取新元素,iter::collect收集到一个新的载体(或一些其他类型的集合)。

例如,如果 barVec<i32> (或任何其他原始整数类型)并且您想向每个元素添加 10,请尝试

bar = bar.into_iter().map(|x| x + 10).collect();

(playground)

或者,您可以就地改变元素

bar.iter_mut().for_each(|x| *x += 10);

(playground)

这基本上就像一个 for 循环,但更加简洁。这通常比第一种方法更有效,因为您不需要分配新的向量(足够聪明的编译器可能能够避免这种情况)。唯一的缺点是这个版本不太灵活。输出仍然需要是一个向量;你不能切换到哈希集或者你有什么。您也无法保留旧矢量的副本。有关可能的示例,请参见下文。

fn main() {
let mut bar = vec![2, 4, 5, 6, 7];
// Overwrite the old vector
bar = bar.into_iter().map(|x| x + 10).collect();
println!("new bar: {:?}", bar);

let bar = vec![2, 4, 5, 6, 7];
// Make a completely new vector
// Note that this works only because i32 implements the Copy trait,
// so we can make copies of the elements of bar without any problems
// In more general situations, we may need to clone each element
let foo: Vec<_> = bar.iter().map(|&x| x + 10).collect();
println!("old bar: {:?} (it's still around)", bar);
println!("new foo: {:?}", foo);

use std::collections::HashSet;
let bar = vec![2, 4, 5, 6, 7];
// transform the data and collect it into a HashSet
// instead of a vector
let bar: HashSet<_> = bar.into_iter().map(|x| x + 10).collect();
println!("new bar: {:?} (note that now bar is unordered)", bar);

let mut bar = vec![2, 4, 5, 6, 7];
// Overwrite the old vector in place
bar.iter_mut().for_each(|x| *x += 10);
println!("new bar: {:?}", bar);
}

(playground)

关于vector - 如何在 Rust 中将相同的整数添加到向量的每个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58345708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com