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

如何在Rust中克隆保留固定容量的Vector?

克隆Vec时保留原容量的高效方法

默认情况下,Vec::clone()只会为新向量分配刚好容纳现有元素的最小容量(正如你给出的示例所示)。如果想要克隆时保留原向量的容量,这里有两种高效实现方式:

1. 安全简洁的首选方案:预分配容量 + 批量复制

直接创建一个与原向量容量相同的空Vec,再通过extend_from_slice批量复制元素。这种方式无需unsafe代码,性能接近最优:

fn main() {
    let mut x = Vec::with_capacity(10);
    x.push(1);
    x.push(2);
    x.push(3);
    println!("x capacity: {}", x.capacity()); // 10

    // 保留容量的克隆操作
    let mut y = Vec::with_capacity(x.capacity());
    y.extend_from_slice(&x);
    println!("y capacity: {}", y.capacity()); // 10
    println!("y elements: {:?}", y); // [1,2,3]
}

2. 极致性能的unsafe实现(需谨慎使用)

如果追求极限性能,可以通过unsafe代码直接操作内存复制,但必须自己保证内存安全:

  • 先创建对应容量的空Vec
  • 用std::ptr::copy_nonoverlapping复制原Vec的元素内存到新Vec
  • 手动设置新Vec的长度

示例代码:

use std::ptr;

fn main() {
    let mut x = Vec::with_capacity(10);
    x.push(1);
    x.push(2);
    x.push(3);
    println!("x capacity: {}", x.capacity()); // 10

    let mut y = Vec::with_capacity(x.capacity());
    unsafe {
        // 复制原向量元素到新向量的内存区域
        ptr::copy_nonoverlapping(x.as_ptr(), y.as_mut_ptr(), x.len());
        // 手动设置新向量长度,必须确保复制元素数不超过容量
        y.set_len(x.len());
    }
    println!("y capacity: {}", y.capacity()); // 10
    println!("y elements: {:?}", y); // [1,2,3]
}

注意:第二种unsafe方法虽然性能略高,但一旦处理失误(比如长度设置错误、内存重叠)会触发未定义行为,非必要场景优先选择第一种安全方案。

内容的提问来源于stack exchange,提问作者Christopher Rybicki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:05:23