std::all_of用于判断容器所有元素是否都满足条件,不修改数据、短路返回、空容器默认返回true;适用于全量断言场景,参数为左闭右开区间和一元谓词,需注意空容器逻辑、谓词纯度及迭代器类型兼容性。

直接说结论:std::all_of 用来判断**容器中所有元素是否都满足某个条件**,它不修改数据、不遍历到末尾就返回、且对空容器默认返回 true —— 这点容易踩坑。
什么时候用 std::all_of?
当你需要做「全量断言」时,比如:
- 检查
std::vector是否所有数都大于 0 - 验证
std::string每个字符是否都是小写字母 - 确认
std::list<:shared_ptr>>中没有空指针
它比手写 for 循环更清晰,也比 std::find_if + 反向逻辑更直白。但注意:它不是用来找元素的,也不是用来计数的。
std::all_of 的参数和谓词怎么写?
签名是:bool std::all_of(Iterator first, Iterator last, UnaryPredicate pred)。三个参数缺一不可:
立即学习“C++免费学习笔记(深入)”;
-
first和last是左闭右开区间(和大多数 STL 算法一致) -
pred是一元谓词:接收一个元素,返回bool;可以是 lambda、函数指针、重载了operator()的仿函数 - 谓词里不要修改元素(
pred应为 const-correct),否则行为未定义
常见错误是把谓词写成「存在一个满足」的逻辑,比如误写 [x](int v) { return v == x; } —— 这适合 std::any_of,不是 all_of 的用法。
std::vectorv = {2, 4, 6, 8}; bool all_even = std::all_of(v.begin(), v.end(), [](int x) { return x % 2 == 0; // ✅ 正确:每个元素都满足「是偶数」 }); std::string s = "hello"; bool all_lower = std::all_of(s.begin(), s.end(), [](char c) { return std::islower(static_cast (c)); // ✅ 注意 islower 要求 unsigned char });
空容器、性能与兼容性要注意什么?
std::all_of 对空范围(first == last)直接返回 true,这是逻辑上的「vacuously true」,但业务上可能不符合预期 —— 比如你本意是「至少有一个且全部满足」,那就得额外判空。
- 它在第一个不满足条件的元素处就 短路返回 false,所以最坏时间复杂度是 O(n),平均可能远好于 O(n)
- C++11 起可用,无特殊依赖;但若用
std::execution::par等并行策略,需 C++17 且编译器支持 - 谓词捕获变量时注意生命周期:lambda 若捕获局部变量的引用,在算法调用结束后使用会悬垂
真正容易被忽略的是:它不保证迭代器类型必须是随机访问 —— 输入迭代器(如 std::forward_list::iterator)也合法,但别指望能用 it + n 那套操作。










