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

如何在Rust中高效替换Vec的指定部分元素?

在Rust中高效替换向量指定区域的元素

在Rust里,替换向量指定索引范围的元素,最高效且符合标准库规范的方式是使用copy_from_slice方法——这就是你要找的内置函数,它直接通过底层内存拷贝完成操作,比逐个赋值的硬编码方式性能高得多。

核心实现:copy_from_slice

这个方法要求目标切片和源切片的长度完全一致,会把源切片的内容原地拷贝到目标切片对应的内存区域,无需额外分配内存。

示例代码:

fn main() {
    let mut v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
    let u = vec![0, 0, 0, 0];

    // 从v的索引2开始,替换连续4个元素(对应u的全部长度)
    v[2..6].copy_from_slice(&u);

    println!("v = {:?}", v); // 输出: v = [1, 2, 0, 0, 0, 0, 7, 8, 9]
}

注意事项

  • 若目标切片和源切片长度不一致,程序会直接panic。如果需要避免这种情况,可以先做长度检查:
fn main() {
    let mut v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
    let u = vec![0, 0, 0, 0];

    let start_idx = 2;
    if start_idx + u.len() <= v.len() {
        v[start_idx..start_idx+u.len()].copy_from_slice(&u);
    } else {
        // 根据业务需求处理长度不足的情况,比如打印错误或终止程序
        eprintln!("源向量长度超过目标区域可用空间");
    }

    println!("v = {:?}", v);
}

备选方案:迭代器逐个赋值

如果需要在赋值前对元素做自定义处理(比如转换类型、修改值),可以用迭代器结合索引的方式,虽然性能不如内存拷贝,但灵活性更高:

fn main() {
    let mut v = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
    let u = vec![0, 0, 0, 0];

    u.iter()
        .enumerate()
        .for_each(|(i, &val)| {
            // 这里可以添加自定义逻辑,比如 val * 2
            v[2 + i] = val;
        });

    println!("v = {:?}", v);
}

内容的提问来源于stack exchange,提问作者Swaroop Maddu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:30:54