应初始化max_val和min_val为数组首元素,从第二个元素开始遍历比较;避免用0、int_max或int_min初始化,否则全负数时结果错误。

用 for 循环遍历找最大最小值(最常用)
直接初始化 max_val 为第一个元素,min_val 同理,然后从第二个元素开始比较。别用 INT_MAX/INT_MIN 初始化——如果数组全为负数,min_val 就永远不会被更新。
常见错误:循环从索引 0 开始重复比较首元素,导致逻辑冗余或越界(比如误写 i )。
示例:
int arr[] = {3, -1, 7, 2, -5};
int size = 5;
int max_val = arr[0], min_val = arr[0];
<p>for (int i = 1; i max_val) max_val = arr[i];
if (arr[i] </p><h3>用 std::max_element 和 std::min_element(STL 方式)</h3><p>更安全、更简洁,返回迭代器,需解引用获取值。注意:两个函数都要求容器支持随机访问或前向迭代,且非空——传空容器会未定义行为(不是抛异常,是崩溃或乱值)。</p><p>性能上,它们内部仍是单次遍历,和手写 for 效率一致;但代码更短,不易出错。</p><p>使用要点:</p>
- 头文件必须包含
<algorithm></algorithm> - 传入范围用
begin(arr)/end(arr)或指针区间,如std::max_element(arr, arr + size) - 记得判空:
if (size == 0) return;
示例:
auto max_it = std::max_element(arr, arr + size); auto min_it = std::min_element(arr, arr + size); int max_val = *max_it; int min_val = *min_it;
一次循环同时更新 max 和 min(减少比较次数)
如果数据量极大(比如百万级),可以优化比较次数:每两个元素先比一次大小,再分别和当前 max_val/min_val 比,理论最多做 3n/2 次比较,比两次单独遍历(2n 次)略优。
但实际中,除非在嵌入式或高频数值计算场景,否则没必要——编译器优化和 CPU 分支预测让常规写法更快,且可读性差。
关键细节:
- 要处理奇数长度:先把第一个元素赋给
max_val和min_val,然后两两处理剩余元素 - 避免对同一元素重复赋值或漏判边界
vector 容器怎么写(避免 size() 返回 unsigned 导致的警告)
用 std::vector<int></int> 时,v.size() 是 size_t(无符号),若用 int i = v.size() - 1 在空 vector 下会溢出成极大正数,引发死循环。
安全写法:
- 用有符号类型作循环变量时,显式转成
int并先判断非空:if (!v.empty()) { for (int i = 0; i - 或统一用
size_t i = 0,但循环条件写成i ,且确保不出现 <code>i--类操作 - 更推荐范围 for:
for (int x : v) { if (x > max_val) max_val = x; ... },彻底避开索引问题
真正容易被忽略的是:初学者常把 max_val 初始化成 0,结果遇到全负数数组就失效——这个坑比语法错误更隐蔽,也更难调试。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











