MST

星途 面试题库

面试题:Rust迭代器自定义类型的复杂转换与性能优化

定义一个自定义结构体`Student`,包含`name: String`、`grades: Vec<i32>`字段。有一个`Vec<Student>`集合,使用迭代器计算每个学生的平均成绩,并将成绩大于等于60分的学生的姓名及其平均成绩收集到一个`HashMap<String, f64>`中。在实现过程中,请优化性能,避免不必要的内存分配和数据拷贝,并详细说明你采取的优化措施以及这样做的原因。
18.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::collections::HashMap;

#[derive(Debug)]
struct Student {
    name: String,
    grades: Vec<i32>,
}

fn main() {
    let students: Vec<Student> = vec![
        Student {
            name: "Alice".to_string(),
            grades: vec![85, 90, 78],
        },
        Student {
            name: "Bob".to_string(),
            grades: vec![55, 48, 60],
        },
        Student {
            name: "Charlie".to_string(),
            grades: vec![70, 65, 72],
        },
    ];

    let result: HashMap<String, f64> = students
      .into_iter()
      .filter_map(|student| {
            let total: i32 = student.grades.iter().sum();
            let average = total as f64 / student.grades.len() as f64;
            if average >= 60.0 {
                Some((student.name, average))
            } else {
                None
            }
        })
      .collect();

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

优化措施及原因:

  1. 使用into_iterinto_iter会消耗集合,避免了数据的拷贝,直接将所有权转移到迭代器中,从而提升性能。
  2. filter_map中直接处理数据:避免了中间变量的创建和额外的内存分配。在filter_map闭包中,计算平均成绩并判断是否大于等于60分,直接生成SomeNone,减少了不必要的内存操作。
  3. 使用sum方法sum方法可以高效地对Vec<i32>中的所有元素求和,避免了手动遍历和累加,提高了代码的简洁性和性能。