std::ranges::all_of用于检查范围所有元素是否满足谓词,接受单个范围(如vector、array)和lambda,空范围返回true;需c++20、头文件,不支持迭代器对,短路执行。

std::ranges::all_of的基本用法
直接用 std::ranges::all_of 配合 lambda 判断每个元素是否大于 0 即可,不需要手写循环或提前 break。
它和老式 std::all_of 行为一致,但支持范围(range)语法,更简洁安全:
#include <ranges>
#include <vector>
#include <iostream>
int main() {
std::vector<int> v = {1, 2, 3, 4};
bool all_positive = std::ranges::all_of(v, [](int x) { return x > 0; });
std::cout
<p>注意:<code>std::ranges::all_of</code> 是 C++20 引入的,编译需加 <code>-std=c++20</code>(如 g++-11+ 或 clang-13+)。</p>
<h3>空容器返回 true 是设计行为</h3>
<p>空 vector、空 array 或空 span 传给 <code>std::ranges::all_of</code> 会返回 <code>true</code> —— 这不是 bug,是逻辑上“全满足”在空集下默认成立(vacuous truth)。</p>
<p>如果你业务上要求“至少一个正数”,不能只靠 <code>all_of</code>,得额外判断 size:</p>
<ul>
<li><code>!v.empty() && std::ranges::all_of(v, [](int x) { return x > 0; })</code></li>
<li>否则 <code>{}</code> 或 <code>{}</code>(空初始化)会误判为“全为正数”</li>
</ul>
<h3>迭代器范围 vs. 容器对象传参的区别</h3>
<p><code>std::ranges::all_of</code> 接受 range(比如 <code>std::vector</code>、<code>std::array</code>、<code>std::span</code>),不接受裸指针 + size 组合;而老式 <code>std::all_of</code> 必须传 begin/end 迭代器。</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>
<p>常见错误写法:</p>
<ul>
<li>❌ <code>std::ranges::all_of(v.begin(), v.end(), ...)</code> —— 编译失败,参数类型不匹配</li>
<li>✅ <code>std::ranges::all_of(v, ...)</code> —— 正确,v 是 range</li>
<li>✅ <code>std::ranges::all_of(std::span{v}, ...)</code> —— 也合法,span 是 view</li>
</ul>
<p>如果只有 C 风格数组,推荐转成 <code>std::span</code> 或用 <code>std::ranges::all_of(std::views::all(arr), ...)</code>。</p>
<h3>性能和短路行为没变化</h3>
<p><code>std::ranges::all_of</code> 和旧版一样,从左到右遍历,遇到第一个不满足条件的元素就立即返回 <code>false</code>,不会继续检查剩余项。</p>
<p>这意味着:</p>
<ul>
<li>对 <code>{-1, 1, 2, 3}</code>,只检查第一个元素就返回 false</li>
<li>对 <code>{1, 2, 3, -1}</code>,检查到第 4 个才返回 false</li>
<li>没有额外开销,底层仍是普通迭代器遍历,无 range adaptor chain 的构造成本</li>
</ul>
<p>别被 “ranges” 名字误导——它只是接口更干净,不是 lazy evaluation。</p></int></iostream></vector></ranges>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










