• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我是张洪铭我是熊博士
时光静好,与君同;细水长流,与君语
博客园    首页    新随笔    联系   管理    订阅  订阅

STL 算法 std::for_each

std::for_each(threads.begin(),threads.end(), std::mem_fn(&std::thread::join));

1. 说明

2. 写用法

3.写样例

 

直接参考 cplusplus官网讲解: http://www.cplusplus.com/reference/algorithm/for_each/

 

 

 

我的理解:

std::for_each

第一个参数表示一段区间的开始,可以是迭代器,也可以是数组的某个位置;

第二个参数表示一段区间的结束,可以是迭代器,也可以是数组的某个位置;

第三个参数表示一个可调用对象,可以是函数,可以是函数对象,也可以是lamdba;

std::for_each 返回第三个参数,或者第三个参数的右值引用。

 

思考:std::for_each遍历一段区间,并把区间内的每一个成员作为参数传递给可调用对象,那么问题来了,遍历过程中,有且仅有一个参数被传递给可调用对象, 假设可调用对象有不止一个参数,又该如何处理呢? 请看下面的代码例子。

练习代码:

 1 // for_each example
 2 #include <iostream>     // std::cout
 3 #include <algorithm>    // std::for_each
 4 #include <vector>       // std::vector
 5 
 6 void myfunction (int i) {  // function:
 7   std::cout << ' ' << i;
 8 }
 9 
10 struct myclass {           // function object type:  one paramter
11   void operator() (int i) {std::cout << ' ' << i;}
12 } myobject;
13  
14 struct myclass_twoParam {           // function object type:  two or more paramter
15   void operator() (int i, int ii) {std::cout << ' ' << i<<" "<<ii;}  
16 } myobject_TwoParam;
17 
18 
19 
20 int main () {
21   std::vector<int> myvector;
22   myvector.push_back(10);
23   myvector.push_back(20);
24   myvector.push_back(30);
25 
26   std::cout << "myvector contains: ";
27   for_each (myvector.begin(), myvector.end(), myfunction);  //给 for_each 传递一个函数
28   std::cout << '\n';
29 
30   // or:
31   std::cout << "myvector contains:";
32   for_each (myvector.begin(), myvector.end(), myobject);   //给 for_each 传递一个函数对象
33 std::cout << '\n';
34
35 // or:
36 std::cout << "myvector contains:";//给 for_each 传递一个lamdba
37 for_each (myvector.begin(), myvector.end(), [&](int i){myobject_TwoParam(i, 100);}); //当可调用对象或者函数的参数数量超过两个时, 可以给 for_each传递一个lamdba临时可调用对象,用这个临时可调用对象将原可调用对象包裹一次。
38 std::cout << '\n';
39
40 return 0;
41   }

结果输出:

 

 

原创文章, 转载请注明出处!

 

posted @ 2021-10-04 16:38  我是张洪铭我是熊博士  阅读(3427)  评论(0)    收藏  举报
刷新页面返回顶部
Copyright © 2025 我是张洪铭我是熊博士
Powered by .NET 9.0 on Kubernetes