MST
星途 面试题库

面试题:Rust迭代器在自定义类型与性能优化场景下的应用

定义一个自定义类型MyType,包含多个字段。假设有一个Vec<MyType>,现在要对这个向量进行操作:首先根据某个字段过滤元素,然后对过滤后的元素根据另一个字段进行排序,最后将排序后的结果进行映射操作得到新的结果集。在实现过程中,需要对性能进行优化,避免不必要的内存分配和复制。请详细阐述实现思路,并给出关键代码片段。
34.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 过滤元素:使用filter方法对Vec<MyType>进行过滤,通过闭包来指定根据哪个字段进行过滤。由于filter返回的是一个Filter迭代器,不会立即分配新的内存,而是按需生成元素,避免了不必要的内存分配。
  2. 排序:在过滤后的迭代器上使用collect方法将其转换回Vec,然后调用sort_by_key方法,通过闭包指定根据另一个字段进行排序。sort_by_key会直接在原向量上进行排序,避免额外的内存分配。
  3. 映射操作:排序后,对这个Vec使用iter方法获取一个迭代器,然后调用map方法进行映射操作,生成新的结果集。map返回的是一个Map迭代器,不会立即分配新内存,最后使用collect方法将其收集成最终的结果集。

关键代码片段

// 定义自定义类型
struct MyType {
    field1: i32,
    field2: String,
    // 其他字段...
}

fn main() {
    let mut my_vec: Vec<MyType> = vec![
        MyType { field1: 3, field2: "c".to_string() },
        MyType { field1: 1, field2: "a".to_string() },
        MyType { field1: 2, field2: "b".to_string() },
    ];

    // 过滤元素
    let filtered = my_vec.iter().filter(|item| item.field1 > 1);

    // 排序
    let mut sorted: Vec<&MyType> = filtered.collect();
    sorted.sort_by_key(|item| &item.field2);

    // 映射操作
    let result: Vec<String> = sorted.iter().map(|item| item.field2.clone()).collect();

    println!("{:?}", result);
}

在上述代码中:

  • 首先定义了MyType结构体。
  • 然后创建了一个Vec<MyType>
  • 使用filter根据field1过滤元素。
  • collectVec<&MyType>后用sort_by_key根据field2排序。
  • 最后通过mapcollect得到新的Vec<String>结果集。这样的实现方式尽量避免了不必要的内存分配和复制。