Rust中如何对Vec元素执行算术运算(就地修改/新建Vec)
Rust 中
Vec<f64>元素算术运算的两类惯用实现 就地修改原有Vec
这类操作要求Vec本身是mut可变绑定,全程不会产生新的堆内存分配,性能最优,核心写法是调用iter_mut()获取元素的可变引用,遍历过程中直接修改引用指向的值:
let mut float_vec: Vec<f64> = vec![1.2, 3.4, 5.6]; // 示例:所有元素乘以10后向下取整 float_vec.iter_mut().for_each(|val| { *val = (*val * 10.0).floor(); }); // 修改后float_vec值为[12.0, 34.0, 56.0]
如果逻辑分支比较复杂,用普通for循环搭配iter_mut()写法完全等价,没有性能差异,按可读性选择即可:
for val in float_vec.iter_mut() { if *val > 20.0 { *val *= 0.5; } else { *val += 1.0; } }
不推荐用下标索引(for i in 0..float_vec.len() { float_vec[i] = ... })的写法,迭代器方案已经被标准库做了充分的边界检查优化,可读性和安全性都更好。
基于运算结果生成全新Vec
如果需要保留原有Vec的数据不变,直接用不可变迭代器iter()配合map()做值转换,最后通过collect()收集为新的Vec即可,新Vec会单独分配堆内存存储结果:
let original: Vec<f64> = vec![1.2, 3.4, 5.6]; // 示例:生成所有元素的正弦值新Vec,原Vec完全不受影响 let sin_values: Vec<f64> = original.iter().map(|val| val.sin()).collect();
如果原有Vec后续不再需要使用,可以换成into_iter()获取元素的所有权,省去解引用步骤,同时编译器能做更激进的所有权优化:
let original: Vec<f64> = vec![1.2, 3.4, 5.6]; // 消费original的所有权生成新Vec,original后续无法再访问 let rounded: Vec<f64> = original.into_iter().map(|val| val.round()).collect();
内容的提问来源于stack exchange,提问作者pnadeau
相关产品推荐
相关产品推荐

