本章描述C++泛型算法for_each的设计和使用。
我们先来看看C++官方网站上对for_each的描述
http://www.cplusplus.com/reference/algorithm/for_each/
(注:以下内容是我对C++官方网站上内容的理解,不准确的地方请见谅)
template <class InputIterator, class Function> Function for_each (InputIterator first, InputIterator last, Function fn);
对[first, last)范围内的所有元素都执行Function fn的操作。
(注: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 }