std::all_of返回true当且仅当区间为空或所有元素满足一元谓词;它短路求值,不比较元素间关系,需包含,空容器恒返回true。

std::all_of 的基本用法和返回逻辑
std::all_of 不是“判断是否全相等”,而是“检查区间内每个元素是否都满足某个一元谓词”。它返回 true 当且仅当区间为空,或所有元素调用谓词后都返回 true;只要有一个元素让谓词返回 false,就立刻返回 false(短路求值)。
常见误用是把它当成 std::equal 或手动写循环比对值——它不比较元素之间关系,只对每个元素单独做判断。
- 头文件必须包含
<algorithm></algorithm> - 第一个参数是起始迭代器,第二个是结束迭代器(左闭右开),第三个是可调用对象(lambda、函数指针、函数对象)
- 空容器(如
std::vector<int>{}</int>)调用std::all_of恒返回true,这点常被忽略
判断所有元素大于 0 的典型写法
这是最直观的使用场景:检查容器是否“全为正数”。
std::vector<int> v = {1, 2, 3, 4};
bool all_positive = std::all_of(v.begin(), v.end(), [](int x) { return x > 0; });
// → true
std::vector<int> w = {1, -2, 3};
bool all_positive2 = std::all_of(w.begin(), w.end(), [](int x) { return x > 0; });
// → false(遇到 -2 就停)
</int></int>
注意 lambda 中不能捕获局部变量而不加说明——如果需要引用外部变量,得显式写 [&] 或 [=],否则编译报错 error: variable 'x' cannot be implicitly captured。
和 std::any_of / std::none_of 的行为对比
三者签名一致,但语义不同,容易混淆:
-
std::all_of(it1, it2, pred):全部满足 →true -
std::any_of(it1, it2, pred):至少一个满足 →true -
std::none_of(it1, it2, pred):全部都不满足 →true
例如检查是否“没有负数”,可以写 std::none_of(v.begin(), v.end(), [](int x){return x ,而不是对 <code>std::all_of 取反——后者在空容器时结果相反:!std::all_of(..., [](x){x 对空容器返回 <code>true(因为原式为 true),但语义上“空容器没有负数”是对的;而“没有负数”本意就是 std::none_of,更直接、不易出错。
自定义类型与迭代器失效风险
对 std::list 或 std::forward_list 使用 std::all_of 完全合法,但要注意:谓词中若修改了容器(比如在 lambda 里调用 v.erase()),会导致迭代器失效,引发未定义行为。
- 谓词必须是纯函数(不修改传入元素,不修改外部状态,不抛异常——除非你声明
noexcept并确保) - 如果元素类型重载了
operator bool(),可直接用std::all_of(v.begin(), v.end(), [](const auto& x){ return x; })判断是否“全为真值” - 性能上无额外开销:就是一次遍历,复杂度 O(n),且短路,实际可能远少于 n 次调用
真正容易出问题的是把 std::all_of 用在多线程共享容器上——它不加锁,也不保证原子性,别指望它能替代同步逻辑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











