面试题答案
一键面试- 使用迭代器(Iterator):
- Rust的迭代器是惰性求值的,并且在处理集合时非常高效。可以使用
iter
方法获取向量的迭代器,对其元素进行翻倍操作,然后使用collect
方法将结果收集到一个新的向量中。这样可以减少不必要的中间数据结构。
fn double_vector(vec: Vec<i32>) -> Vec<i32> { vec.iter().map(|&x| x * 2).collect() }
- Rust的迭代器是惰性求值的,并且在处理集合时非常高效。可以使用
- 预先分配内存:
- 如果知道处理后向量的大小,可以在开始处理前预先分配足够的内存,避免在处理过程中多次重新分配内存。可以使用
with_capacity
方法来预先分配内存。
fn double_vector_prealloc(vec: Vec<i32>) -> Vec<i32> { let mut result = Vec::with_capacity(vec.len()); for &num in vec.iter() { result.push(num * 2); } result }
- 如果知道处理后向量的大小,可以在开始处理前预先分配足够的内存,避免在处理过程中多次重新分配内存。可以使用
- 避免不必要的克隆:
- 在上述代码中,使用
&x
来获取对向量元素的引用,避免了不必要的克隆操作。如果向量元素类型实现了Copy
trait(如i32
),这样做可以减少性能开销。
- 在上述代码中,使用
- 并行处理(如果适用):
- 对于非常大量的数据,可以考虑使用并行迭代器(如
rayon
库提供的并行迭代器)来利用多核CPU的优势。首先引入rayon
库:
然后修改函数如下:[dependencies] rayon = "1.5.1"
并行处理需要注意线程安全和数据竞争问题,同时也要注意并行带来的额外开销,适用于数据量足够大的场景。use rayon::prelude::*; fn double_vector_parallel(vec: Vec<i32>) -> Vec<i32> { vec.par_iter().map(|&x| x * 2).collect() }
- 对于非常大量的数据,可以考虑使用并行迭代器(如