std::is_sorted 是判断单调递增最简可靠的方案,支持默认非严格递增和显式严格递增;手写循环需注意索引上限为 n-2、用 > 判断下降、并覆盖空/单元素边界。

用 std::is_sorted 最快判断单调递增
标准库提供现成工具,比手写循环更可靠、更易读。只要数组(或容器)支持随机访问迭代器,std::is_sorted 就能直接用:
- 默认行为判断「非严格递增」(即允许相等),要严格递增需传入
std::less<int>{}</int>或 lambda - 注意它检查的是
[first, last)范围,别漏掉末尾元素 - 对原始数组需配合
std::begin/std::end或指针算术,例如:std::is_sorted(arr, arr + n)
手写循环时如何避免越界和逻辑反向
常见错误是循环从 i = 0 开始比较 arr[i] > arr[i + 1],导致访问 arr[n]——越界未定义行为。正确做法是让索引只走到 n - 2:
- 循环条件必须是
i ,不是 <code>i - 判断条件用
>(发现下降就返回 false),而不是(那是在找上升) - 空数组或单元素数组应视为单调递增,循环前需特判或让循环自然跳过
for (int i = 0; i arr[i + 1]) return false; } return true;
std::is_sorted 和手写循环的性能与语义差异
两者时间复杂度都是 O(n),但实际表现有细节差别:
-
std::is_sorted可能做优化(如 SIMD 向量化),但小数组无明显优势;手写循环更容易被编译器内联 -
std::is_sorted默认使用operator,若自定义类型没重载或重载不一致,结果可能出人意料 - 严格递增需求下,手写循环写
>更直观;用std::is_sorted则必须显式传std::less{},否则{1,1,2}也会返回 true
用 std::adjacent_find 的另类写法
有人喜欢函数式风格:找第一对「左边大于右边」的相邻元素。这本质和手写循环等价,但更声明式:
- 调用
std::adjacent_find(first, last, [](auto a, auto b) { return a > b; }) == last - 注意 lambda 参数顺序是「前一个、后一个」,别写反成
(b, a) - 它返回迭代器,比较时用
== last判断没找到,不是用!= first
真正容易被忽略的是边界情况:空数组、全相同元素、含 INT_MAX 后续又出现更大值(不可能但逻辑上要覆盖)。不管选哪种方法,测试用例至少得包括 {}、{5}、{1,2,2,3}、{1,3,2} 这四类。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











