C++ranges::for_each遍历执行函数

2026-04-02 10:30:24 1331阅读 0评论

C++ ranges::for_each 遍历执行函数

在现代C++编程中,ranges::for_each 是一个非常强大且方便的工具,用于遍历容器并对每个元素执行某个操作。本文将详细介绍如何使用 ranges::for_each 来遍历容器并执行自定义函数。

基本概念

ranges::for_each 是 C++20 引入的一个范围库函数,属于 <algorithm> 头文件。它的主要作用是对容器中的每个元素执行指定的操作。这个函数非常类似于传统的 std::for_each,但更符合现代 C++ 的风格和特性。

函数签名

template< class InputIt, class UnaryOperation >
UnaryOperation for_each( InputIt first, InputIt last, UnaryOperation op );

template< class ExecutionPolicy, class ForwardIt, class UnaryOperation >
ForwardIt for_each( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryOperation op );

template< class Range, class UnaryOperation >
UnaryOperation for_each( Range&& range, UnaryOperation op );
  • firstlast:表示要遍历的范围。
  • op:是要应用到每个元素上的操作函数。

示例代码

下面是一个简单的示例,展示了如何使用 ranges::for_each 来遍历一个向量并对每个元素进行平方运算:

C++ranges::for_each遍历执行函数

#include <iostream>
#include <vector>
#include <algorithm> // 包含 ranges::for_each

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用 ranges::for_each 对每个元素进行平方运算
    ranges::for_each(vec.begin(), vec.end(), [](int& x) {
        x *= x;
    });

    // 输出结果
    for (const auto& elem : vec) {
        std::cout << elem << " ";
    }
    return 0;
}

在这个示例中,我们首先创建了一个包含整数的向量 vec。然后,我们使用 ranges::for_each 遍历向量中的每个元素,并对每个元素进行平方运算。最后,我们输出处理后的向量。

自定义函数

ranges::for_each 可以接受任何可调用对象作为操作函数,包括普通函数、Lambda 表达式、成员函数等。以下是一些自定义函数的例子:

成员函数

假设我们有一个类 Person,我们希望对每个 Person 对象的年龄进行递增:

class Person {
public:
    int age;

    void incrementAge() {
        ++age;
    }
};

int main() {
    std::vector<Person> people = {{25}, {30}, {35}};

    // 使用 ranges::for_each 调用成员函数
    ranges::for_each(people.begin(), people.end(), &Person::incrementAge);

    // 输出结果
    for (const auto& person : people) {
        std::cout << person.age << " ";
    }
    return 0;
}

在这个示例中,我们定义了一个 Person 类,并实现了一个成员函数 incrementAge。然后,我们使用 ranges::for_each 遍历 people 向量,并调用每个 Person 对象的 incrementAge 方法。

Lambda 表达式

Lambda 表达式是一种匿名函数,可以方便地在需要时定义和使用。以下是一个使用 Lambda 表达式的示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用 Lambda 表达式对每个元素进行平方运算
    ranges::for_each(vec.begin(), vec.end(), [](int& x) {
        x *= x;
    });

    // 输出结果
    for (const auto& elem : vec) {
        std::cout << elem << " ";
    }
    return 0;
}

在这个示例中,我们使用了一个 Lambda 表达式来对每个元素进行平方运算。

并行遍历

ranges::for_each 还支持并行遍历,可以通过传递不同的执行策略来实现。以下是一个使用并行策略的示例:

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution> // 包含执行策略

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用并行策略对每个元素进行平方运算
    ranges::for_each(std::execution::par, vec.begin(), vec.end(), [](int& x) {
        x *= x;
    });

    // 输出结果
    for (const auto& elem : vec) {
        std::cout << elem << " ";
    }
    return 0;
}

在这个示例中,我们使用了 std::execution::par 执行策略来进行并行遍历。

总结

ranges::for_each 是一个非常强大的工具,可以简化对容器的遍历和操作。通过结合不同的操作函数和执行策略,我们可以灵活地实现各种复杂的逻辑。希望本文能帮助你更好地理解和使用 ranges::for_each

文章版权声明:除非注明,否则均为Dark零点博客原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
验证码
评论列表 (暂无评论,1331人围观)

还没有评论,来说两句吧...

目录[+]