c++中的 for_each 函数

在C++中,for_each是一个通用的算法,用于对容器中的所有元素执行给定的函数。for_each函数是定义在头文件中的,它是C++标准库的一部分。for_each主要用于遍历容器,如vector、list、set等,对容器中的每个元素执行特定操作。
for_each()事实上是個 function template,其源码如下:

template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn);

参数:

  • first 输入迭代器,指向容器中第一个元素
  • last 输入迭代器,指向容器中最后一个元素的下一个位置
  • fn 一个可调用对象(函数指针、函数对象或Lambda表达式),它接受容器中元素的引用作为参数

返回值:

  • for_each函数返回传入的可调用对象(Function类型的对象)

for_each() 是一个非常有用的函数,它有助于在 STL 容器中的每个元素上调用函数对象fn。这实际上有助于编写简短的代码并减少我们代码库的大小。以下几种fn调用的情况:

1、lambda方式

#include <iostream>
#include <algorithm>
#include <vector>int main()
{std::vector<int> vec;size_t count = 10;for (size_t i = 0; i < count; i++){vec.emplace_back(i + 1);}std::for_each(vec.begin(), vec.end(), [&](int value){ std::cout << value << std::endl; });system("pause");return 0;
}

遍历结果:

1 2 3 4 5 6 7 8 9 10

2、普通函数

#include <iostream>
#include <vector>
#include <algorithm>void increment(int& value)
{value++;
}int main()
{std::vector<int> numbers = {1, 2, 3, 4, 5};std::for_each(numbers.begin(), numbers.end(), increment);for (int number : numbers) {std::cout << number << " ";}return 0;
}

遍历结果:

2 3 4 5 6

3、仿函数

#include <iostream>
#include <vector>
#include <algorithm>class Fun
{public:void operator() (const int num) {std::cout << num << " ";}
};int main()
{std::vector<int> numbers = {1, 2, 3, 4, 5};std::for_each(numbers.begin(), numbers.end(), Fun());return 0;
}

遍历结果:

1 2 3 4 5

使用 for_each() 的好处是它减少了代码库的大小并使代码产品级别。此外,时间复杂度为 O(n)。如果有任何情况,其中每个元素都经过大型代码库的大量处理,您可以使用 for_each()

注:并行功能

在C++17中,std::for_each函数得到了扩展,增加了支持并行算法的功能。新版本的std::for_each允许在多个线程中并发地执行操作,以提高性能。这是通过添加一个名为ExecutionPolicy的额外参数实现的,这个参数指定了执行策略。
std::for_each的并行版本原型如下:

template< class ExecutionPolicy, class ForwardIt, class UnaryFunction >
UnaryFunction for_each(ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryFunction f);

参数:

  • policy:一个执行策略对象,指示算法的并行执行方式。可选的执行策略有:

    • std::execution::seq:顺序执行(非并行)
    • std::execution::par:并行执行
    • std::execution::par_unseq:并行和向量化执行
  • first:迭代器,指向容器中第一个元素
  • last:迭代器,指向容器中最后一个元素的下一个位置
  • f:一个可调用对象(函数指针、函数对象或Lambda表达式),它接受容器中元素的引用作为参数

要使用并行版本的std::for_each,需要包含头文件,并将合适的执行策略传递给函数,下面是一个简单的示例,演示了如何使用并行std::for_each遍历std::vector容器,并为每个元素加1:

#include <iostream>
#include <vector>
#include <algorithm>
#include <execution>int main()
{std::vector<int> numbers = {1, 2, 3, 4, 5};std::for_each(std::execution::par, numbers.begin(), numbers.end(), [](int& value) {value++;});for (int number : numbers) {std::cout << number << " ";}return 0;
}

输出结果(注意,由于并行执行,输出顺序可能会有所不同):

2 3 4 5 6

请注意,并行版本的std::for_each要求编译器和标准库支持C++17及以上版本。另外,并行版本可能并不总是比顺序版本更快,因为它可能受到硬件、数据量、可调用对象的复杂性等因素的影响。在选择并行版本之前,最好先进行性能测试。

c++中的 for_each 函数相关推荐

  1. STL中的for_each()函数

    for_each()函数是C++ STL中的一个遍历函数,函数原型如下: for_each(InputIterator first, InputIterator last, Function func ...

  2. 在C++中使用Lambda函数提高代码性能

    使编译器以及操作系统从正在创建的应用中榨取更高性能的关键在于提供充足的有关代码意图的信息.在充分了解这个代码意图实现的功能等信息的情况下, 就有可能将代码在编译时和运行时的并行吞吐量最大化,令开发者可 ...

  3. OpenCV 相机校正过程中,calibrateCamera函数projectPoints函数的重投影误差的分析

    OpenCV 校正过程中,calibrateCamera函数的ret和重投影误差的分析 OpenCV对相机进行校正的过程中,校正返回值retval和重投影误差的计算公式表示和分析. OpenCV 校正 ...

  4. Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...

    我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...

  5. C++11 :STL中的 iota ()函数

    该函数是C++11 才引入,之前版本没有此函数. iota 函数是一个计算机语言中的函数,用于产生连续的值.该函数得名自 APL 语言,其中用来产生从 1 开始的连续数值. 该函数位于头文件#incl ...

  6. Matlab中的lsqcurvefit函数的使用

    Matlab中的lsqcurvefit函数的使用 lsqcurvefit函数 调用示例 lsqcurvefit函数 非线性曲线拟合是已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数 ...

  7. 在Vue的webpack中结合runder函数

    在Vue的webpack中结合runder函数 1.引入: <h1>下面是vue的内容:</h1><div id="app"><login ...

  8. 【OpenCV】OpenCV中积分图函数与应用

    OpenCV中积分图函数与应用 参考资料 opencv 查找integral,目前网上大部分的资料来自于opencv https://docs.opencv.org/master/d7/d1b/gro ...

  9. Oralce中的to_date()函数

    Oralce中的to_date()函数   to_date( '".$params['ORDER_TIME']."','YYYY-MM-DD') TO_DATE(:BEGIN_DA ...

最新文章

  1. 【每日DP】day1 P1802 5倍经验日(别样的01背包)难度⭐★
  2. 新手探索NLP(八)——序列标注
  3. java把信息存到文件里,Java 如何将字符串信息直接写保存到文本文件?
  4. Codeforces 336C 0-1背包
  5. 腾讯云短信出现there are both domestic mobile phone numbers and international mobile phone numbers in the...
  6. NET 对象生命周期
  7. Maven的核心笔记(2)原生:HelloWorldMaven
  8. Nginx 中 nginx.conf 详解
  9. java 栈_Java实现单链表、栈、队列三种数据结构
  10. FLASH和EEPROM的最大区别
  11. 花瓣网服务器维护一个月,花瓣网维护网站推荐-只需要这一个网站就够了
  12. Android聊天软件开发(基于网易云IM即时通讯)——发送文本消息(四)
  13. 青岛科技大学计算机历年真题,青岛科技大学计算机组成原理补考试卷(计算机)...
  14. UMLChina公众号文章精选(20220227更新精选)
  15. 如何给word文档添加注释
  16. 前度监控(埋点)设计方案
  17. 哈尔滨工业大学(深圳)本科毕业设计(论文)LaTeX模板:hitszthesis
  18. JIRA 从低版本升级到高版本(3 6 2- 6 0 8)
  19. 【Py】pyecharts数据可视化案例——地下室空气治理
  20. 服务器程序框架 - Linux C++网络编程(十三)

热门文章

  1. Android学习之zygote启动流程
  2. php去除换行(回车换行)的方法
  3. C# textbox快捷键添加横杠
  4. Py西游攻关之IO model
  5. 计算机键盘优点,机械键盘有哪些优点
  6. 达芬奇系列教程1——安装及屏幕显示字体太小问题解决
  7. 基于Word的论文多级标题与图表题注的解决办法
  8. 【JMeter】Jmeter分布式压测教程
  9. c语言变量是直接寻址,直接寻址页变量
  10. 【Linux-MYSQL】数据库的使用