首页 > 编程笔记

C++ for_each()遍历算法详解

for_each() 是 C++ 标准库<algorithm>头文件中提供的一种遍历算法,用于对一个序列(或一个范围内)中的每个元素执行指定的操作(可以是一个函数或者一个函数对象)。

for_each() 的语法格式如下:
template <class InputIterator, class Function>
Function for_each (InputIterator first, InputIterator last, Function fn);

for_each() 遍历 [first, last) 范围内的元素,对每一个元素应用 fn,一旦整个范围都被遍历,for_each() 将 fn 返回。

设计 for_each() 函数的主要目的是用来替换开发者手写的循环操作,如 for,while,do…while 等。这些循环操作本身功能比较简单,需要开发者自己处理迭代器的取值、步进。如果没有仔细处理,很容易导致错误。而如果用 for_each(),上述操作细节则由 C++ 标准库代劳,减轻了开发者的负担。

【实例一】 fn 为使用普通函数。
#include <iostream>
#include <vector>
#include <algorithm>

void print(int value) {
    std::cout << value << " ";
}

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::for_each(nums.begin(), nums.end(), print);  // 输出: 1 2 3 4 5
    return 0;
}
示例中使用了一个普通函数 print() 来打印 vector 中的每个元素。执行结果为:

1 2 3 4 5


【实例二】fn 使用 Lambda 函数。
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::for_each(nums.begin(), nums.end(), [](int value) {
        std::cout << value * value << " ";
    });  // 输出: 1 4 9 16 25
    return 0;
}
示例中使用了一个 lambda 函数,它接受一个整数并打印其平方。执行结果为:

1 4 9 16 25


【实例三】fn 使用函数对象(仿函数)。
#include <iostream>
#include <vector>
#include <algorithm>

class Printer {
public:
    void operator()(int value) {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    std::vector<int> nums = {1, 2, 3};
    Printer printer;
    std::for_each(nums.begin(), nums.end(), printer); 
    /* 输出:
    Value: 1
    Value: 2
    Value: 3
    */
    return 0;
}
示例中定义了一个名为 Printer 的函数对象,并使用它来打印 vector 中的每个元素。执行结果为:

Value: 1
Value: 2
Value: 3

总结

for_each() 是 C++ 标准库中非常有用的遍历算法,它提供了一个简单的方式来应用相同的操作或行为到一个范围的每一个元素。

无论是使用常规函数、lambda 还是函数对象,for_each() 都能提供清晰和高效的遍历方法。

推荐阅读