std::max_element和std::min_element最省事,返回迭代器需解引用;空区间行为未定义;一次遍历找极值更高效;原生数组传参易因sizeof误算长度;自定义类型需重载operator

用 std::max_element 和 std::min_element 最省事
标准库函数直接返回迭代器,不用手写循环,也避免越界风险。但要注意它们返回的是指针(迭代器),不是值本身。
- 必须传入合法的非空区间,否则行为未定义;空数组会崩溃
- 对
std::vector、原生数组都适用,但原生数组要配std::begin()/std::end() - 如果只关心值,记得解引用:*
std::max_element(v.begin(), v.end()) - 若需同时找最大最小,别调两次——一次遍历更高效,见下一条
一次遍历同时获取最大最小值(推荐用于性能敏感场景)
尤其在大数组或嵌入式环境里,两次遍历比一次多花近一倍时间。手写循环控制力更强,也容易加调试逻辑。
- 初始化时用首元素,别用
INT_MAX/INT_MIN——类型不匹配或溢出风险高 - 注意无符号类型(如
size_t)不能用负数初始化 - 示例:
int min = arr[0], max = arr[0];<br>for (size_t i = 1; i if (arr[i] if (arr[i] > max) max = arr[i];<br>}
原生数组传参时忘记传长度,sizeof 容易误算
C++ 函数参数里数组会退化为指针,sizeof(arr) 返回指针大小(通常是 8),不是数组字节数。
- 正确做法:显式传长度,或用模板推导:
template<size_t n><br>void find_minmax(int (&arr)[N]) { /* N 可用 */ }</size_t> - 错误写法:
sizeof(arr)/sizeof(arr[0])在函数体内失效 - 更安全的选择:改用
std::array或std::vector,自带size()
自定义类型或结构体怎么比?得重载 operator 或传比较函数
默认比较靠 operator,如果没定义就会编译失败。比如结构体成员是 <code>std::string,但你想按长度比,就得自己写逻辑。
- 用 lambda 传比较函数最灵活:
auto it_max = std::max_element(v.begin(), v.end(),<br> [](const Person& a, const Person& b) { return a.age - 重载
operator 要确保满足严格弱序,否则 <code>std::sort等也会出错 - 注意:
std::min_element和std::max_element的比较逻辑必须一致,否则结果不可靠
实际写的时候,先确认数据规模和是否需要同时取极值;小项目图快用标准算法,大数组或关键路径就手写单次遍历;原生数组边界处理永远是最容易漏掉的一环。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











