C++ranges::for_each遍历执行函数
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 );
first和last:表示要遍历的范围。op:是要应用到每个元素上的操作函数。
示例代码
下面是一个简单的示例,展示了如何使用 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。


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