最推荐用 std::max_element,需解引用获取值;手写循环应以首元素初始化;避免排序或 reduce 等低效或兼容性差的方法;务必处理空数组、单元素、全负数边界情况。

用 std::max_element 最省事,但别忘了解引用
直接调用 std::max_element 是 C++ 里最安全、最通用的方式,它返回的是迭代器,不是值本身——这是新手掉进最多次的坑。不加 * 解引用,结果是地址或随机大数,不是你想要的最大值。
- 对普通数组:先转成指针范围,比如
std::max_element(arr, arr + n) - 对
std::vector<int></int>:直接传v.begin()和v.end() - 空数组会返回尾迭代器,必须检查是否等于
end,否则解引用崩溃 - 时间复杂度 O(n),和手写循环一样,但语义清晰、不易错
手写 for 循环查最大值,初始化不能用 0
用 int max = 0 开始遍历,遇到全负数数组就翻车——最大值会被卡死在 0。正确做法是用第一个元素初始化,或者用 INT_MIN(需包含 <climits></climits>)。
- 推荐:
int max = arr[0](前提是n > 0) - 避免:
int max = 0或int max = -1,它们不是通用初始值 - 如果数组可能为空,必须先判断
n == 0,否则arr[0]越界 - 循环从
i = 1开始,跳过已用作初值的首项
用 std::reduce 并行求最大值?小心编译器和标准库支持
std::reduce 理论上能利用多核加速,但实际中容易踩兼容性坑:GCC 10+ 才开始稳定支持并行策略,MSVC 对 std::execution::par 支持有限,而且对小数组反而更慢。
- 基础用法:
std::reduce(arr, arr + n, INT_MIN, std::max<int>)</int> - 加并行需显式传策略,如
std::reduce(std::execution::par, ...) - 没有
<execution></execution>头文件或链接失败?说明编译器没开 C++17 并行支持,别硬上 - 数组长度小于几百时,并行开销远超收益,纯属画蛇添足
为什么不用 qsort 或 std::sort 再取末尾?
排序再取最大值看似直观,但时间和空间成本完全不匹配:O(n log n) 时间、O(log n) 栈空间(快排递归),而找最大值只需 O(n) 单次扫描。除非你后续还要用排序后数组,否则纯属浪费。
立即学习“C++免费学习笔记(深入)”;
-
std::sort(arr, arr + n)后读arr[n-1]—— 可行但低效,且破坏原数组顺序 -
qsort更麻烦:要写比较函数,类型不安全,C 风格易出错 - 如果只是查最大值,
std::max_element或手写循环,两者任选其一就够了 - 注意:
std::max_element不改变原数组,语义上更干净
最常被忽略的是边界处理——空数组、单元素、全负数这三种情况,任何写法都得单独兜底。写完别急着提交,拿这三组数据跑一遍。










