std::is_sorted(arr, arr + n, std::greater{}) 判断严格单调递减,要求每对相邻元素满足 a[i] > a[i+1];含重复值时返回 false。

用 std::is_sorted 判断单调递减要传 std::greater
标准库提供了现成工具,但很多人直接写 std::is_sorted(arr, arr + n),结果判断的是“是否非递增”(即允许相等),而且默认按升序逻辑检查——这会导致误判。正确做法是显式指定比较谓词:std::is_sorted(arr, arr + n, std::greater{})。注意两点:一是必须传 std::greater{}(C++14 起支持模板参数推导),不能只写 std::greater(类型不完整);二是该函数检查的是“严格大于还是大于等于”?答案是:它检查的是“对每对相邻元素 a[i] 和 a[i+1],是否满足 a[i] > a[i+1]”,也就是严格单调递减。如果数组含重复值(如 {5, 4, 4, 2}),它会返回 false。
手写循环时别漏掉边界和相等情况
手动遍历是最直观的方式,但容易在索引和条件上出错。常见错误包括:用 i 导致访问 <code>a[i+1] 越界;或写成 a[i] >= a[i+1] 却声称“判断单调递减”,其实那是非递增。真正判断严格单调递减,循环条件应为:
for (int i = 0; i <p>关键点:</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master"><img src="https://img.php.cn/upload/skill/000/000/081/179051228971575.jpg" alt="C++ Code Review Master" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="overflowclass">C++ Code Review Master</a> <p class="overflowclass">组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。</p> </div> <a rel="nofollow" href="/xiazai/skill5502" title="C++ Code Review Master" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
-
i上界是n - 1,确保i + 1不越界 - 只要出现
a[i] (哪怕相等),立刻返回 <code>false - 空数组或单元素数组应视为单调递减(数学定义和 STL 行为一致)
用 std::adjacent_find 可以一行写出且短路求值
如果你偏好函数式风格又想避免手写循环,std::adjacent_find 是个轻量替代:std::adjacent_find(arr, arr + n, [](int x, int y) { return x 。它从左到右找第一对不满足“严格递减”的相邻元素(即 <code>x ),找到就返回该位置,否则返回尾迭代器。这个写法天然短路,性能不输手写循环,而且语义清晰。注意:lambda 必须捕获“<h3>自定义容器或迭代器范围时小心 <code>end - 1 比较
当数组封装在 std::vector 或其它容器中,有人会误用 std::is_sorted(v.begin(), v.end() - 1, ...),这是错的——v.end() - 1 是最后一个元素,而 is_sorted 需要的是“末尾之后的位置”。正确写法永远是 v.begin() 和 v.end()。另外,若数据来自 C 风格字符串(char*),记得长度不含终止符,别把 \0 当作有效元素参与比较。
最易被忽略的是:单调性判断依赖于你对“递减”的定义。业务中常混淆“严格递减”和“非递增”,而 std::greater{} 和手写 检查分别对应这两种语义——选错一个,测试用例就全崩。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










