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