You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用同一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:45:03