MST

星途 面试题库

面试题:C++自定义数据类型结合transform的数据过滤优化

自定义一个类`Student`,包含成员变量`int id`、`std::string name`、`double score`。现有一个`std::vector<Student>`,请使用`transform`算法过滤出成绩(`score`)大于80分的学生,并将这些学生的`id`值增加100。要求在实现过程中考虑性能优化,比如减少不必要的拷贝等。请详细写出实现代码及优化思路。
16.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

class Student {
public:
    int id;
    std::string name;
    double score;
};

// 定义过滤和修改的函数对象
struct FilterAndModify {
    bool operator()(const Student& student) {
        return student.score > 80;
    }
    void operator()(Student& student) {
        student.id += 100;
    }
};

std::vector<Student> filterAndModifyStudents(std::vector<Student>& students) {
    std::vector<Student> result;
    // 使用back_inserter避免不必要的拷贝
    std::transform(students.begin(), students.end(), std::back_inserter(result), [](Student& student) {
        if (student.score > 80) {
            student.id += 100;
            return student;
        }
        return Student();
    });
    result.erase(std::remove_if(result.begin(), result.end(), [](const Student& student) {
        return student.id == 0 && student.name.empty() && student.score == 0;
    }), result.end());
    return result;
}

int main() {
    std::vector<Student> students = {
        {1, "Alice", 75},
        {2, "Bob", 85},
        {3, "Charlie", 90}
    };

    std::vector<Student> filteredStudents = filterAndModifyStudents(students);

    for (const auto& student : filteredStudents) {
        std::cout << "ID: " << student.id << ", Name: " << student.name << ", Score: " << student.score << std::endl;
    }

    return 0;
}

优化思路

  1. 使用std::back_inserter:在std::transform中使用std::back_inserter将符合条件的Student对象直接插入到结果vector中,避免了每次插入时的拷贝构造。
  2. Lambda 表达式:通过Lambda表达式在std::transform中同时进行过滤和修改操作,提高代码的简洁性和可读性。
  3. 移除无效元素:在std::transform后,使用std::remove_if移除由于不符合条件而插入的无效Student对象,进一步优化内存占用。