能否使用同一个C++ lambda函数获取数组的最高分和最低分
解答
你完全可以复用已有的比较逻辑lambda,不需要额外写新的lambda实现最低分统计,有两种常用的复用方案:
方案1:抽离lambda为具名变量,分别调用最大值、最小值查找接口
你现在的匿名lambda本质是定义了「按学生分数从小到大排序」的比较规则,这个规则同时适配std::max_element和std::min_element两个STL算法的要求:
std::max_element会返回符合「a < b」规则下的最大元素std::min_element会返回符合「a < b」规则下的最小元素
你只需要把匿名lambda定义成可复用的变量即可,示例修改片段:
// 把比较逻辑抽成可复用的lambda变量 const auto compareByScore = [](const Student& a, const Student& b) { return a.points < b.points; }; // 找最高分,复用compareByScore const auto max_score = std::max_element(arr.begin(), arr.end(), compareByScore); // 找最低分,复用同一个compareByScore const auto min_score = std::min_element(arr.begin(), arr.end(), compareByScore);
方案2:单次遍历同时获取最高、最低分(更高效)
如果同时需要最高和最低分,更推荐用std::minmax_element接口,整个数组只需遍历1次,比两次调用查找接口节省一半遍历开销,同样可以复用你的比较逻辑:
const auto compareByScore = [](const Student& a, const Student& b) { return a.points < b.points; }; // 返回值pair的first是最小值迭代器,second是最大值迭代器 const auto [min_score, max_score] = std::minmax_element(arr.begin(), arr.end(), compareByScore); std::cout << "最高分:" << max_score->name << " " << max_score->points << "分\n"; std::cout << "最低分:" << min_score->name << " " << min_score->points << "分\n";
如果你的编译环境不支持C++17及以上标准,把上述代码中的结构化绑定替换为pair取值即可:
const auto score_pair = std::minmax_element(arr.begin(), arr.end(), compareByScore); const auto min_score = score_pair.first; const auto max_score = score_pair.second;
完整可运行修改后代码
#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 }, { "Paul", 4 }, { "Mood", 1 }, { "Barbara", 10 }, { "Jack", 5 } } }; const auto compareByScore = [](const Student& a, const Student& b) { return a.points < b.points; }; const auto [min_score, max_score] = std::minmax_element(arr.begin(), arr.end(), compareByScore); std::cout << max_score->name << " has " << max_score->points << " points (highest)\n"; std::cout << min_score->name << " has " << min_score->points << " points (lowest)\n"; return 0; }
注:你原代码的注释存在笔误,最高分实际是Barbara的10分,不是Anna的8分。
内容的提问来源于stack exchange,提问作者user16672266
相关产品推荐
相关产品推荐

