std::for_each

本章描述C++泛型算法for_each的设计和使用。


 我们先来看看C++官方网站上对for_each的描述

http://www.cplusplus.com/reference/algorithm/for_each/

(注:以下内容是我对C++官方网站上内容的理解,不准确的地方请见谅)

  • for_each的函数声明:
template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function fn);
  • for_each的作用:

对[first, last)范围内的所有元素都执行Function fn的操作。

  • for_each的实现:

(注:C++98和C++11中关于这个函数的实现方法有些不同,我们现在先只看C++98的实现)

根据这个函数的实现,不难看出参数和返回值得类型,范围和使用方法,这里不再赘述。

 1 template<class InputIterator, class Function>
 2 Function for_each(InputIterator first, InputIterator last, Function fn)
 3 {
 4   while (first!=last)
 5   {
 6     fn (*first);
 7     ++first;
 8   }
 9   return fn;      // or, since C++11: return move(fn);
10 }

理论上的东西基本就这些,以下是我写的一个简单的例子

 1 #include <algorithm>
 2 
 3 #include <iostream>
 4 #include <vector>
 5 #include <string>
 6 
 7 using std::vector;
 8 using std::string;
 9 using std::cout;
10 using std::endl;
11 
12 template<class InputIter, class Func>
13 Func LTM_for_each(InputIter first, InputIter last, Func func)
14 {
15     while (first != last)
16     {
17         func(*first);
18         ++first;
19     }
20     return func;
21 }
22 
23 void helperFunction(string& str) // 注:如果你想用这个函数修改[first,last)中的值,那参数一定要用引用(涉及到传参方式,这里就不说了)。
24 {
25     str += ".cpp";
26 }
27 
28 void print(vector<string> vec)
29 {
30     vector<string>::iterator iter;
31     for (iter = vec.begin(); iter != vec.end(); iter++)
32     {
33         cout << *iter << endl;
34     }
35     cout << endl;
36 }
37 
38 int main(void)
39 {
40     string vecVal[] = {"a", "b", "c", "d"};
41     vector<string> vec(vecVal, vecVal+4);
42     print(vec);
43 
44     for_each(vec.begin(), vec.end(), helperFunction);
45     // LTM_for_each(vec.begin(), vec.end(), helperFunction);
46     print(vec);
47 
48     return 0;
49 }
原文地址:https://www.cnblogs.com/chinshing/p/3969298.html