← 目录 / 第十一章 · STL 标准模板库 / 11.13.6 条件判断与遍历

11.13.6 条件判断与遍历

all_of、any_of、none_of、for_each —— 对整个区间做条件判断,或者对每个元素执行同一个操作。

📂 引入头文件:#include <algorithm> —— 本节算法全部在这里。
本页目录
① all_of / any_of / none_of

这三个函数都用一个返回 bool 的判断函数(通常是 lambda)去检查区间里的每个元素,最终给出一个整体的 true / false 结论:

函数含义什么时候为 true
all_of是否全部满足条件每一个元素都满足才为 true
any_of是否至少一个满足条件只要有一个满足就为 true
none_of是否全部都不满足条件一个都不满足才为 true
v = {2, 4, 6, 8};判断条件:x % 2 == 0(是否为偶数)
2
4
6
8
all_of(全是偶数?)
true
any_of(有负数?)
false
none_of(没有 0?)
true
四个元素全部满足"是偶数"这个条件,所以 all_oftrue;没有任何元素是负数,所以"有负数?"的 any_offalse;没有任何元素等于 0,所以"没有0?"的 none_oftrue
C++ · all_of / any_of / none_of
1vector<int> v = {2, 4, 6, 8};
2
3bool all_even = all_of(v.begin(), v.end(), [](int x) {
4 return x % 2 == 0;
5});
6cout << "全是偶数? " << all_even << endl; // 1(true)
7
8bool has_negative = any_of(v.begin(), v.end(), [](int x) {
9 return x < 0;
10});
11cout << "有负数? " << has_negative << endl; // 0(false)
12
13bool none_zero = none_of(v.begin(), v.end(), [](int x) {
14 return x == 0;
15});
16cout << "没有0? " << none_zero << endl; // 1(true)
💡
cout 输出 bool 类型时会显示 1(true)或 0(false),而不是文字"true"/"false"——这是 C++ 的默认行为,想显示文字可以用 cout << boolalpha
② for_each —— 对每个元素执行操作

对区间内的每一个元素依次执行同一个操作(通常是一个 lambda)。如果想修改元素本身,lambda 的参数要用引用接收。

C++ · for_each 遍历与修改
1vector<int> v = {1, 2, 3, 4, 5};
2
3// 打印每个元素
4for_each(v.begin(), v.end(), [](int x) {
5 cout << x << " ";
6});
7cout << endl; // 输出:1 2 3 4 5
8
9// 每个元素翻倍
10for_each(v.begin(), v.end(), [](int& x) { // 注意用引用才能修改
11 x *= 2;
12});
13// v 变成 {2, 4, 6, 8, 10}
⚠️
按值 vs 按引用:例子第一个 lambda 用 [](int x)(按值),只能读取不能修改原数组;第二个用 [](int& x)(按引用),才能真正改变 v 里的元素。这和第 8 章学过的"传值 vs 传引用"是同一个道理。
💡
虽然 for_each 很灵活,但大多数情况下,范围 for 循环for (int x : v))更简洁易读,效果完全一样。for_each 的优势是可以利用并行策略(C++17 起支持并行算法,比如 for_each(std::execution::par, ...)),处理海量数据时能自动多线程加速——这是范围 for 循环做不到的。
🎯
本节小结——也是整个 11.13 节的收尾:STL 算法的核心思想是"容器负责存数据,算法负责处理数据",两者通过迭代器解耦。学会这套思路之后,写竞赛代码时遇到排序、查找、去重、求和这些常见操作,第一反应应该是"STL 里有没有现成的算法",而不是从零手写循环——这样既省时间,又不容易出 bug。