You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:16:02