Rust合并Vec<f64>:三种方法对比及性能与所有权疑问
合并多个小型Vec的方案对比与疑问解答
关于extend_from_slice的性能损耗
extend_from_slice确实会复制元素,但对于**小型Vecf64是Copy类型,复制操作就是底层内存块的直接拷贝,没有额外堆分配或复杂逻辑开销。
如果你之后还需要使用源Vec(比如示例里的h和i),这种方法是最优选择——它明确传达了“源数据不会被修改”的语义,代码可读性更强。
如何消费源Vec而无需声明可变
你可以使用Vec::extend配合into_iter(),直接消费源Vec的所有权,不需要将源Vec声明为可变:
let mut d: Vec<f64> = vec![]; let e = vec![0.0, 1.0]; let f = vec![2.0, 3.0]; // 消费e和f的所有权,将元素直接转移到d中 d.extend(e.into_iter()); d.extend(f.into_iter()); dbg!(d);
into_iter()会获取源Vec的所有权,把它的元素直接转移到目标Vec里,之后e和f就无法再被使用(所有权已被消耗)。这种方式和append性能一致——都是直接转移内存元素,没有复制开销,但不需要源Vec是可变的。
四种方案的适用场景总结
concat:适合已经持有Vec<Vec<f64>>集合的场景,代码最简洁,但本质是复制元素(依赖T: Clone约束),若子Vec数量多、元素量大,会产生额外复制成本。append:需要源Vec可变,会清空源Vec并转移其内存元素,无复制开销,但可变声明容易让读者误解源数据会被修改,语义不够清晰。extend_from_slice:无需源Vec可变,语义明确(源数据只读),小型Vec场景性能无压力,适合需要保留源Vec后续使用的情况。extend + into_iter():无需源Vec可变,直接消费所有权,无复制开销,适合不需要再使用源Vec的场景,语义清晰且简洁。
内容的提问来源于stack exchange,提问作者dim_voly
相关产品推荐
相关产品推荐

