我可以在C++中使用一个lambda函数来获得数组的最佳和最差分数吗



我正在C++中练习lambda函数,所以我试图获得一些学生中最好和最差的分数。我得到了最好的分数,但我在问自己,我是否可以从相同的lambda函数中得到最差的分数,或者我应该为最差的学生创建另一个分数?如果我能做到这一点,我该怎么做?

这是我的代码:

#include <algorithm>
#include <iostream>
#include <string>
#include <array>
struct Student{
std::string name;
int points;
};
int main(){
std::array<Student, 8> arr{
{ { "Yannik", 3 },
{ "Monica", 5 },
{ "Christine", 2 },
{ "Anna", 8 }, // Dan has the most points (8).
{ "Paul", 4 },
{ "Mood", 1 },
{ "Barbara", 10 },
{ "Jack", 5 } }
};
const auto score{ std::max_element(arr.begin(),arr.end(),[](const Student &student, const Student &student1){
return (student.points<student1.points);
})};
std::cout<<score->name<<" has " <<score->points <<" pointsn";
return 0;
}


如果您想同时获得容器的最小值和最大值,您可以简单地使用std::minmax_element算法,因为它比单独调用std::min_elementstd::max_element更有效。

代码变成了类似的东西

#include <algorithm>
#include <array>
#include <iostream>
#include <string>
struct Student {
std::string name;
int points;
};
int main() {
std::array<Student, 8> arr{{{"Yannik", 3},
{"Monica", 5},
{"Christine", 2},
{"Anna", 8},  // Dan has the most points (8).
{"Paul", 4},
{"Mood", 1},
{"Barbara", 10},
{"Jack", 5}}};
auto [min_iter, max_iter] = std::minmax_element(
arr.begin(), arr.end(),
[](const Student &student, const Student &student1) { return (student.points < student1.points); });
std::cout << min_iter->name << " has " << min_iter->points << " pointsn";
std::cout << max_iter->name << " has " << max_iter->points << " pointsn";
return 0;
}

使用C++20,我们还可以使用";范围版本";使用std::ranges::minmax_element并传递整个数组,而不是传递迭代器对。

相关线路变为

auto [min_iter, max_iter] = std::ranges::minmax_element(
arr, [](const Student &student, const Student &student1) { return (student.points < student1.points); });

与前面没有范围的情况一样,传递给算法的lambda函数是"0";比较器";我们使用来比较两个CCD_ 5对象。但是还有更好的方法,IMHO。我们可以使用std::less作为比较器,但告诉范围库使用Student类的points字段进行比较。这可以使用投影来完成。

相关线路变为

auto [min_iter, max_iter] = std::ranges::minmax_element(arr, {}, &Student::points);

传递给算法的第二个自变量({})意味着";使用默认值";,即CCD_ 10。第三个论点是投影。投影也可以是一个lambda函数,它返回比较器应该使用的值,但在这种情况下,只指定我们要用于比较的类字段更简单。

完整代码变为

#include <algorithm>
#include <array>
#include <iostream>
#include <string>
struct Student {
std::string name;
int points;
};
int main() {
std::array<Student, 8> arr{{{"Yannik", 3},
{"Monica", 5},
{"Christine", 2},
{"Anna", 8},  // Dan has the most points (8).
{"Paul", 4},
{"Mood", 1},
{"Barbara", 10},
{"Jack", 5}}};
auto [min_iter, max_iter] = std::ranges::minmax_element(arr, {}, &Student::points);
std::cout << min_iter->name << " has " << min_iter->points << " pointsn";
std::cout << max_iter->name << " has " << max_iter->points << " pointsn";
return 0;
}

最新更新