如何在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
相关产品推荐
相关产品推荐

