for_each()算法

导言

for_each()算法非常灵活,它允许我们以不同的方式访问、处理、修改每一个元素。虽然很方便,但是随着C++11的到来,基于范围的for循环提供了更方便更自然的行为,因此,for_each的重要性逐渐丧失,由Range-based for 循环取代。下面介绍for_each的4中常用用法。

正文

1. for_each()传入Lambda

下面的例子把每一个元素传给一个lambda(传值的方式),后者将它获得的元素都打印出来:

vector<int> coll = {1, 2, 3, 4, 5, 6};
for_each(coll.begin(), coll.end(),// range
        [](int elem){ // operation
            cout << elem << " ";
        }
);

下面的例子利用lambda修改每一个元素(以传引用的方式):

for_each(coll.begin(), coll.end(),
        [](int &elem){
            elem += 10;// 每一个元素都加10
        }
);

2. for_each()传入普通函数

上面的Lambda可被普通函数取代,不过在实际的代码过程中长使用Lambda,因为Lambda更为简洁,高效。这里仅仅为了学习理论。下面的代码使用普通函数取代了Lambda:

void Print(int elem){
    cout << elem << " ";
}
for_each(coll.begin(), coll.end(),// range
        Print;// 注意是Print
);

3. for_each()传入函数对象

class Test{
    private:
        int _value;
    public:
        Test(int value) : _value(value) {}
        int operator()(int &v) const{// functor 需要重载operator()运算符
            v += _value;
            return v;
        }
};
// coll 中的每个元素都加10
for_each(coll.begin(), coll.end(),
        Test(10); // operation
);

4. for_each()的返回值

for_each()算法有个独门绝技,其他算法没有,就是可以==传回其function object==。请看下面的代码:

见C++标准库第482页
### C++ 中 `for_each` 算法的作用及使用方法 #### 作用 `for_each` 是 C++ 标准模板库(STL)中提供的一个通用算法,用于对容器中的每个元素执行指定的操作。它的主要作用是遍历容器中的所有元素,并将这些元素逐一传递给用户定义的函数或函数对象进行处理[^3]。 #### 使用方法 `for_each` 的函数原型如下: ```cpp template <class InputIterator, class Function> Function for_each(InputIterator first, InputIterator last, Function f); ``` - 参数1:`InputIterator first` 表示要遍历的范围的起始位置。 - 参数2:`InputIterator last` 表示要遍历的范围的结束位置(不包括此位置)。 - 参数3:`Function f` 表示一个函数或函数对象,用于对每个元素执行操作。 `for_each` 返回值为传入的函数对象 `f`,这允许用户在需要时对函数对象的状态进行检查。 #### 示例代码 以下是一个简单的示例,展示如何使用 `std::for_each()` 函数[^1]: ```cpp #include <iostream> #include <vector> #include <algorithm> // 定义一个函数对象 void print(int x) { std::cout << x << " "; } int main() { // 初始化一个整数向量 std::vector<int> nums = {1, 2, 3, 4, 5}; // 使用 for_each 遍历并打印每个元素 std::for_each(nums.begin(), nums.end(), print); return 0; } ``` 运行结果为: ``` 1 2 3 4 5 ``` #### 并行版本 在多核处理器环境中,可以使用并行版本的 `parallel_for_each` 来加速任务处理[^2]。例如,Microsoft 提供的 Parallel Patterns Library (PPL) 支持通过 `concurrency::parallel_for_each` 实现并行遍历。以下是一个简单的并行示例: ```cpp #include <ppl.h> #include <vector> #include <iostream> int main() { std::vector<int> data(1000000, 1); // 创建一个包含一百万个元素的向量 concurrency::parallel_for_each(data.begin(), data.end(), [](int& value) { value *= 2; // 对每个元素乘以2 }); // 打印前几个元素验证结果 for (int i = 0; i < 10; ++i) { std::cout << data[i] << " "; } return 0; } ``` #### 注意事项 1. `for_each` 不会修改容器本身,但可以通过传入的函数对象修改容器中的元素。 2. 如果需要并行化处理,可以考虑使用类似 `parallel_for_each` 的工具。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值