如何最优保留Vec前N个元素并释放未使用容量?
Rust中保留Vec前N个元素并释放未使用容量的优化实现
你的现有实现是合理的,但有几种更简洁或场景适配性更好的替代方案:
方案1:直接通过迭代器收集新Vec
如果可以消耗原Vec(不需要保留原Vec的所有权),可以直接使用迭代器的take方法配合collect一步完成,新Vec会自动分配刚好容纳前2个元素的容量,无需额外收缩操作:
let mut data = vec![1, 2, 3, 4, 5, 6]; let data = data.into_iter().take(2).collect::<Vec<_>>();
这种方式代码更简洁,性能上和原方案相当(均涉及O(n)的元素拷贝,n为保留的元素数)。
方案2:原方案的简化写法
如果必须在原可变Vec上修改,你的原方案已经是标准写法,也可以合并为一行:
let mut data = vec![1, 2, 3, 4, 5, 6]; data.truncate(2); data.shrink_to_fit();
truncate仅修改Vec的长度标记(O(1)操作),shrink_to_fit会尝试重新分配内存匹配当前长度,释放多余容量(实际效果依赖Rust内存分配器,但多数场景下会完成收缩)。
不推荐的方案
比如使用split_off:
let mut data = vec![1, 2, 3, 4, 5, 6]; let _ = data.split_off(2); data.shrink_to_fit();
这种方式需要移动被截断的元素到新Vec,额外消耗O(k)时间(k为被移除的元素数),性能不如前两种方案,除非你需要保留被截断的元素,否则没必要使用。
内容的提问来源于stack exchange,提问作者Moold
相关产品推荐
相关产品推荐

