Algorithms 系列之for_each

 

     c++其中的有个优势就是在集成和许多工具大家可以直接拿过来直接来使用。

我们经常使用的vector string bitset 等等容器都是一些很基本的模板类,有了模板类对应的就会出现模板函数,也就是众多的算法。今天我们要说的这个算式是for_each。

这个模板函数的含义就是对for循环的一个简单的封装,实际上我们在实际的编码过程中也要学会制作一些普通,共用的工具以方便调用。

         下面有一个使用for_each的实例:

          #include <iostream> #include <vector> #include <algorithm> void myfunction(int i) { std::cout<<" "<<i<<std::endl; } struct MyClass{ void operator()(int i){ std::cout<<""<<i<<std::endl; } }MyObject; int main() { std::vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); for_each(myvector.begin(),myvector.end(),myfunction); for_each(myvector.begin(),myvector.end(),MyObject); } 

运行结果:

 10
 20
 30
10
20
30

我们要使用for_each这个模板函数我们就要引用<algorithm>这个头文件。

for_each的函数声明为

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

该函数的第三个参数是一个函数类型,对于这个函数我们可以使用两种方式来实现一种就是回调函数模式;另外一种是函数对象的方式

回调函数的模式大家也都知道,在这里也就不多说了。

重点说说这个函数对象,函数对象不是函数指针,但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了。 函数对象实质上是一个实现了operator()

例如:

      class test{

                    public:

                     int operator()(int a,int b)

                     {

                         return a-b;

                     }

      };

      int main()

{

      test obj;  //define the function object

      obj(5,3)  //the value is 2

      return 0;

}

上面就是一个简单的函数对象的应用实例。当然函数对象还是有它本身许多特性,其中的一个特性就是可以记录上一次保留的数据。进而进行比较操作,有点类似于静态局部变量。如果想了解请参考我之前的总结关于函数对象的应用。

 

我们书归正传,既然这个for_each是一个模板函数我们可以根据其含义自己设置一个。

看下面的代码:

                  #include <iostream> #include <vector> //#include <algorithm> void myfunction(int i) { std::cout<<" "<<i<<std::endl; } struct MyClass{ void operator()(int i){ std::cout<<""<<i<<std::endl; } }MyObject; template<class inputclass,class function> function for_each(inputclass first,inputclass last,function fun) { for(; first != last; ++first) fun(*first); return fun; } int main() { std::vector<int> myvector; myvector.push_back(10); myvector.push_back(20); myvector.push_back(30); for_each(myvector.begin(),myvector.end(),myfunction); for_each(myvector.begin(),myvector.end(),MyObject); } 

有运行的结果:

 10
 20
 30
10
20
30
我们可以看到结果是一样的。

STL的<algorithm>是集合一些模板函数,当然我们也可以对这些函数进行重载或者改装,但是一般情况下不要去动系统封装的函数,要想实现类似的功能最好是起一个别的名字,动用系统的东西,有时候会出现意想不到的错误。

 

 

 

 

如转载请写明出处,谢谢<http://blog.csdn.net/lihui130135>

你可能感兴趣的:(Algorithm,function,struct,Class,each)