for_each 函数 in STL

//#######################################################################

  1. //# Created Time: 2011-3-7 18:02:35
  2. //# File Name: for_each.cpp
  3. //# Description: 
  4. //#######################################################################
  5. #include <iostream>
  6. #include <string>
  7. #include <vector>
  8. #include <algorithm>
  9. using namespace std;  
  10. typedef std::vector<std::pair<std::string, std::string> > pv;  
  11. typedef pv::iterator pitr;  
  12. struct p{  
  13. void operator()(const pitr &iter) const{  
  14.         cout<<iter->first<<"/t"<<iter->second<<endl;  
  15.     }  
  16. };  
  17. int main(){  
  18.     pv v;  
  19.     v.push_back(make_pair("Hello, ", "the world!"));  
  20.     for_each(v.begin(), v.end(), p());  
  21. return 0;  

编译的时候提示:

for_each(v.begin(), v.end(), p()); 这一句中类p中运算()不匹配。

而有人给出了一个版本:

  1. struct p  
  2. {  
  3. void operator()(const pair<string,string>& itr) const{  
  4.         cout<<itr.first<<"/t"<<itr.second<<endl;  
  5.     }  
  6. void operator()(int& a){  
  7.         ++a;  
  8.     }  
  9. }; 

问题解决,编译也通过。但是就是不明白为什么做样做就可以。


刚开始不明白他的意思。后来才明白作为for_each的函数的形参类型有特别的要求。

总结如下: for_each的形参的函数或者类对应的运算符()的形参的有两点要求:

第一:必须为单参数;

第二:必须跟*iter的类型一致或者兼容。既它的形参不能是迭代器或者指针。只能是对象或者它的引用。

为了考证这一点,我到cpluplus网站去看了for_each的接口定义。

template<class InputIterator, class Function>    Function for_each(InputIterator first, InputIterator last, Function f)   //这里f相当于一个函数指针,根据其在函数体中的用法 要求其原型为 FunPtr (*)(容器元素或其引用).   {  //这就是标准库与自己写的程序对正确性要求的区别,你使用标准库,并不是只要给出的参数类型表面上符合就行了,它可能会有一些隐含的条件.比如这里.     for ( ; first!=last; ++first ) f(*first);      return f;    } 
链接:http://www.cplusplus.com/reference/algorithm/for_each/ 1
最后附上一个程序验证这一点:

//#######################################################################  //# Created Time: 2011-3-7 18:02:35  //# File Name: for_each.cpp  //# Description:   //#######################################################################  #include <iostream>  #include <string>  #include <vector>  #include <map>  #include <algorithm>  using namespace std;  typedef std::vector<std::pair<std::string, std::string> > pv;  typedef pv::iterator pitr;  struct p{      void operator()(const pair<string, string> &v) const{          cout<<v.first<<"/t"<<v.second<<endl;      }      void operator()(int  a){          ++a;      }  };  void print(int n)   {      cout << n << " ";  }  int main(){      pv v;      vector<int>   ivec;      for (int i=0; i < 10; i++)          ivec.push_back(i);            v.push_back(make_pair("Hello, ", "the world!"));      for_each(v.begin(), v.end(), p());  //这里P是对象,而这里应该给的是函数指针,所以调用对象的()运算符重载函数,相当于一个伪函数. 这里的括号不能省略.     for_each(ivec.begin(), ivec.end(), p());      for_each(ivec.begin(), ivec.end(), print);  //这里的print直接就是函数,使用时不用加括号.               return 0;  }    
编译通过:
运行结构如下:
Hello,  the world!
0 1 2 3 4 5 6 7 8 9
参考:
  1. cplusplus网站:http://www.cplusplus.com/reference/algorithm/for_each/

转载于:https://my.oschina.net/ray1421/blog/685982

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值