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

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 << all_positive; // 输出 1
}
注意:std::ranges::all_of 是 C++20 引入的,编译需加 -std=c++20(如 g++-11+ 或 clang-13+)。
空容器返回 true 是设计行为
空 vector、空 array 或空 span 传给 std::ranges::all_of 会返回 true —— 这不是 bug,是逻辑上“全满足”在空集下默认成立(vacuous truth)。
立即学习“C++免费学习笔记(深入)”;
如果你业务上要求“至少一个正数”,不能只靠 all_of,得额外判断 size:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
!v.empty() && std::ranges::all_of(v, [](int x) { return x > 0; })- 否则
{}或{}(空初始化)会误判为“全为正数”
迭代器范围 vs. 容器对象传参的区别
std::ranges::all_of 接受 range(比如 std::vector、std::array、std::span),不接受裸指针 + size 组合;而老式 std::all_of 必须传 begin/end 迭代器。
常见错误写法:
- ❌
std::ranges::all_of(v.begin(), v.end(), ...)—— 编译失败,参数类型不匹配 - ✅
std::ranges::all_of(v, ...)—— 正确,v 是 range - ✅
std::ranges::all_of(std::span{v}, ...)—— 也合法,span 是 view
如果只有 C 风格数组,推荐转成 std::span 或用 std::ranges::all_of(std::views::all(arr), ...)。
性能和短路行为没变化
std::ranges::all_of 和旧版一样,从左到右遍历,遇到第一个不满足条件的元素就立即返回 false,不会继续检查剩余项。
这意味着:
- 对
{-1, 1, 2, 3},只检查第一个元素就返回 false - 对
{1, 2, 3, -1},检查到第 4 个才返回 false - 没有额外开销,底层仍是普通迭代器遍历,无 range adaptor chain 的构造成本
别被 “ranges” 名字误导——它只是接口更干净,不是 lazy evaluation。

















