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 }
结果输出:
原创文章, 转载请注明出处!