std::all_of用于判断区间内所有元素是否都满足条件,返回bool值,空区间也返回true;其调用形式为std::all_of(first, last, pred),支持各类迭代器,具短路特性。

std::all_of 用法和基本结构
std::all_of 是 C++11 引入的算法,用于判断区间内所有元素是否都满足某个条件。它返回 bool,真值表示“全部满足”,空区间也返回 true(逻辑上 vacuously true)。
调用形式固定:std::all_of(first, last, pred),其中 first 和 last 是迭代器(左闭右开),pred 是一元谓词(可为 lambda、函数指针或函数对象)。
-
pred必须接受一个参数(元素类型),返回能转换为bool的值 - 不要求容器可随机访问,
std::list、std::vector、原生数组甚至自定义迭代器范围都可用 - 一旦遇到第一个不满足条件的元素,立即返回
false,有短路行为
常见错误:谓词返回类型或捕获方式出错
写 lambda 时最容易漏掉返回类型声明,尤其在复杂表达式中;另外,误用引用捕获导致悬垂引用也是高频问题。
例如,下面这段代码在 vec 生命周期结束后调用 std::all_of 会出问题:
立即学习“C++免费学习笔记(深入)”;
std::vector<int> vec = {1, 2, 3};
auto& ref = vec;
std::all_of(vec.begin(), vec.end(), [&ref](int x) { return x > 0; }); // ❌ ref 捕获无意义且危险
- 应改为值捕获或直接不捕获:
[=](int x) { return x > 0; } - 若需修改外部变量,确保生命周期覆盖整个算法执行期
- 避免在谓词里抛异常——
std::all_of不做异常安全保证,异常会直接传播
与 std::none_of / std::any_of 的语义区别
三者接口一致,但逻辑含义不同,容易混淆使用场景:
-
std::all_of(v.begin(), v.end(), [](auto x){return x>0;})→ “所有数都大于 0” -
std::none_of(v.begin(), v.end(), [](auto x){return x==0;})→ “没有一个等于 0”(等价于!std::any_of(..., ==0)) -
std::any_of(v.begin(), v.end(), [](auto x){return x<0;})→ “至少有一个小于 0”
注意:std::all_of 对空容器返回 true,而 std::any_of 返回 false,这个差异在边界测试中常被忽略。
性能与迭代器类型的影响
std::all_of 是单趟遍历,时间复杂度 O(n),但实际性能受迭代器类型影响明显:
- 对
std::vector或原生数组,随机访问迭代器让 CPU 预取更有效 - 对
std::list,双向迭代器带来更高缓存未命中率,但算法本身无额外开销 - 若谓词本身很重(比如涉及系统调用或内存分配),短路特性就特别关键——早失败早返回
别为了“省一次比较”提前手写循环,标准算法经过充分优化,且语义更清晰。真正要优化的是谓词逻辑本身。
空容器、小数据量、谓词开销大——这些才是决定要不要用 std::all_of 的实际因素,而不是“它是不是标准库函数”。


















