all_of、any_of、none_of、for_each —— 对整个区间做条件判断,或者对每个元素执行同一个操作。
这三个函数都用一个返回 bool 的判断函数(通常是 lambda)去检查区间里的每个元素,最终给出一个整体的 true / false 结论:
| 函数 | 含义 | 什么时候为 true |
|---|---|---|
| all_of | 是否全部满足条件 | 每一个元素都满足才为 true |
| any_of | 是否至少一个满足条件 | 只要有一个满足就为 true |
| none_of | 是否全部都不满足条件 | 一个都不满足才为 true |
all_of 为 true;没有任何元素是负数,所以"有负数?"的 any_of 为 false;没有任何元素等于 0,所以"没有0?"的 none_of 为 true。| 1 | vector<int> v = {2, 4, 6, 8}; |
| 2 | |
| 3 | bool all_even = all_of(v.begin(), v.end(), [](int x) { |
| 4 | return x % 2 == 0; |
| 5 | }); |
| 6 | cout << "全是偶数? " << all_even << endl; // 1(true) |
| 7 | |
| 8 | bool has_negative = any_of(v.begin(), v.end(), [](int x) { |
| 9 | return x < 0; |
| 10 | }); |
| 11 | cout << "有负数? " << has_negative << endl; // 0(false) |
| 12 | |
| 13 | bool none_zero = none_of(v.begin(), v.end(), [](int x) { |
| 14 | return x == 0; |
| 15 | }); |
| 16 | cout << "没有0? " << none_zero << endl; // 1(true) |
cout 输出 bool 类型时会显示 1(true)或 0(false),而不是文字"true"/"false"——这是 C++ 的默认行为,想显示文字可以用 cout << boolalpha。对区间内的每一个元素依次执行同一个操作(通常是一个 lambda)。如果想修改元素本身,lambda 的参数要用引用接收。
| 1 | vector<int> v = {1, 2, 3, 4, 5}; |
| 2 | |
| 3 | // 打印每个元素 |
| 4 | for_each(v.begin(), v.end(), [](int x) { |
| 5 | cout << x << " "; |
| 6 | }); |
| 7 | cout << endl; // 输出:1 2 3 4 5 |
| 8 | |
| 9 | // 每个元素翻倍 |
| 10 | for_each(v.begin(), v.end(), [](int& x) { // 注意用引用才能修改 |
| 11 | x *= 2; |
| 12 | }); |
| 13 | // v 变成 {2, 4, 6, 8, 10} |
[](int x)(按值),只能读取不能修改原数组;第二个用 [](int& x)(按引用),才能真正改变 v 里的元素。这和第 8 章学过的"传值 vs 传引用"是同一个道理。for_each 很灵活,但大多数情况下,范围 for 循环(for (int x : v))更简洁易读,效果完全一样。for_each 的优势是可以利用并行策略(C++17 起支持并行算法,比如 for_each(std::execution::par, ...)),处理海量数据时能自动多线程加速——这是范围 for 循环做不到的。