c++oding="utf-8" ?>
std::ranges::all_of适用于需确认范围内所有元素均满足某条件的场景,接受范围和谓词,返回bool;须包含,不可传迭代器对,支持视图链式组合,空范围返回true,C++20起可用。

std::ranges::all_of 什么时候该用
当你需要遍历整个容器,确认每个元素都满足某个条件时,std::ranges::all_of 是最直接的选择。它比手写循环更清晰,也比先 std::ranges::find_if_not 再判空更语义明确。注意:它不适用于“只要一个满足就停”的场景——那是 std::ranges::any_of 的事。
基本调用写法和常见错误
最简形式是传入范围、谓词函数(或 lambda),返回 bool:
std::vector<int> v = {2, 4, 6, 8};
bool all_even = std::ranges::all_of(v, [](int x) { return x % 2 == 0; }); // true
</int>
容易踩的坑:
- 忘记包含头文件:
(C++20 起) - 误传迭代器对(如
all_of(v.begin(), v.end(), ...))——这是旧式std::all_of,不是 ranges 版;ranges 版只接受**范围(range)**,比如容器本身、视图或初始化列表 - 谓词返回非布尔值(如
int),可能隐式转换但语义模糊,建议显式返回bool
配合 views 使用的典型场景
真正体现 std::ranges::all_of 优势的地方,是和 std::views 链式组合。比如检查“所有正数是否都大于 10”:
std::vector<int> v = {-1, 5, 12, 15};
bool ok = std::ranges::all_of(v | std::views::filter([](int x) { return x > 0; }),
[](int x) { return x > 10; }); // false(5 被过滤后剩下 12,15,都 >10 → true)
</int>
关键点:
- 视图是惰性求值的,
all_of不会提前 materialize 整个中间结果 - 如果过滤后为空范围,
all_of返回true(空集默认满足“所有元素都满足条件”,逻辑上叫 vacuous truth) - 不能把视图绑定到普通引用(如
auto& view = v | views::filter(...);),生命周期易出问题;应直接传入或用auto&&
性能与兼容性注意事项
std::ranges::all_of 在大多数标准库实现中,行为和传统 std::all_of 几乎一致:短路(遇到第一个不满足就返回 false),时间复杂度 O(n),空间 O(1)。
但要注意:
- C++20 起才可用;MSVC 19.28+、GCC 10+、Clang 10+ 支持完整 ranges 特性
- 某些嵌入式或老平台 STL(如 libstdc++ 早于 11)可能只提供部分概念约束,编译失败时先检查
__cpp_lib_ranges宏 - 对
std::list或其他双向/前向范围,它仍能工作,但无法做随机跳转优化——这点和旧版一样,不用特意规避
真正容易被忽略的是谓词捕获变量的生命周期:如果 lambda 捕获了局部对象的引用,而该对象在 all_of 执行完前已析构,就会 UB。务必确保捕获安全,尤其是配合异步或延迟执行时。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











