深入探索 C++ for_each 函数,编程魔法的秘密武器
在 C++ 的编程世界里,for_each 函数就像是一把神奇的钥匙,能够为我们打开高效编程的大门,就让我们一起来揭开它神秘的面纱,探索它的奇妙之处。
想象一下,你正在编写一个程序,需要对一个容器中的每个元素进行相同的操作,如果使用传统的 for 循环,代码可能会显得有些繁琐和复杂,有了 for_each 函数,一切都变得简单而优雅。

for_each 函数的语法非常简洁明了,它接受三个参数:第一个参数是一个输入迭代器,表示要遍历的范围的起始位置;第二个参数是一个输入迭代器,表示要遍历的范围的结束位置;第三个参数是一个函数对象或者函数指针,用于定义对每个元素要执行的操作。
比如说,我们有一个整数向量vector<int> numbers = {1, 2, 3, 4, 5}
,如果想要将每个元素都乘以 2 并输出,使用 for_each 函数可以这样写:

#include <iostream> #include <vector> #include <algorithm> void multiplyByTwo(int& num) { num *= 2; } int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; std::for_each(numbers.begin(), numbers.end(), multiplyByTwo); for (const auto& num : numbers) { std::cout << num << " "; } return 0; }
在这个例子中,multiplyByTwo
函数就是对每个元素执行的操作。
for_each 函数的强大之处不仅在于它的简洁性,还在于它的灵活性,你可以传递一个函数对象,也可以传递一个普通函数指针,函数对象可以包含复杂的逻辑,让你能够处理各种不同的情况。
让我们通过一个小游戏来更好地理解 for_each 函数,假设我们有一个数字猜谜游戏,游戏中生成了一个包含 10 个随机数字的数组,我们的任务是使用 for_each 函数找出其中所有大于 5 的数字,并将它们存储在另一个数组中。
#include <iostream> #include <vector> #include <algorithm> #include <ctime> void filterGreaterThanFive(int& num, std::vector<int>& result) { if (num > 5) { result.push_back(num); } } int main() { std::srand(static_cast<unsigned int>(std::time(nullptr))); std::vector<int> numbers(10); for (int& num : numbers) { num = std::rand() % 10; } std::vector<int> greaterThanFive; std::for_each(numbers.begin(), numbers.end(), [&greaterThanFive](int& num) { if (num > 5) { greaterThanFive.push_back(num); } }); std::cout << "原始数组: "; for (const auto& num : numbers) { std::cout << num << " "; } std::cout << std::endl; std::cout << "大于 5 的数字: "; for (const auto& num : greaterThanFive) { std::cout << num << " "; } return 0; }
通过这个小游戏,我们更加直观地感受到了 for_each 函数在实际编程中的应用。
问答环节:
1、for_each 函数可以用于哪些类型的容器?
2、如果在 for_each 函数中执行的操作引发了异常,会怎样?
3、如何在 for_each 函数中修改传递的容器元素?