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

如何在Rust固定长度数组中实现原地插入并挤掉末尾溢出元素

Rust固定长度数组原地插入实现

首先你给出的示例代码有个小修正:因为需要修改数组内容,传入的借用需要是可变借用&mut x而非不可变借用&x。

安全优雅的实现方案

优先使用标准库slice提供的copy_within方法实现,不需要额外内存、无unsafe代码,符合你要求的优雅实现:

/// 固定长度数组原地插入元素,末尾元素超出时自动挤出
/// arr: 要操作的固定长度数组可变引用
/// value: 要插入的新元素
/// index: 插入位置(从0开始计数)
fn insert_in_place<T: Copy, const N: usize>(arr: &mut [T; N], value: T, index: usize) {
    // 校验索引合法性,允许插入位置最大为数组最后一位
    assert!(index < N, "插入索引不能超过数组长度减1");
    // 将index到倒数第二位的元素整体后移一位,末尾元素直接被覆盖挤出
    arr.copy_within(index..N-1, index + 1);
    // 写入新元素到目标位置
    arr[index] = value;
}

测试验证

对应你给出的预期效果的测试代码如下:

fn main() {
    let mut x = [1, 2, 3, 4, 5];
    insert_in_place(&mut x, 7, 1);
    // 输出结果为 [1, 7, 2, 3, 4],符合预期
    println!("{:?}", x);
}

实现说明

  • 用const泛型适配任意长度的固定数组,不需要硬编码数组长度
  • copy_within是标准库提供的原地内存拷贝方法,底层已经做了性能优化,比手动循环移动元素效率更高
  • 要求元素实现Copy trait,覆盖了所有基础类型(整型、浮点、布尔、固定长度数组等)的常规使用场景,如果需要支持非Copy类型,可以使用std::ptr::copy实现带unsafe的通用版本,学习阶段优先使用上述安全版本即可。

内容的提问来源于stack exchange,提问作者Camden Clark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:54:10