for_each 函數 in STL

//####################################################################### ios

  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中運算()不匹配。 網站

而有人給出了一個版本: spa

  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的函數的形參類型有特別的要求。 code

總結以下: for_each的形參的函數或者類對應的運算符()的形參的有兩點要求: 對象

第一:必須爲單參數; 接口

第二:必須跟*iter的類型一致或者兼容。既它的形參不能是迭代器或者指針。只能是對象或者它的引用。 ip

爲了考證這一點,我到cpluplus網站去看了for_each的接口定義。get

  1. template<class InputIterator, class Function> 
  2.   Function for_each(InputIterator first, InputIterator last, Function f)   //這裏f至關於一個函數指針,根據其在函數體中的用法 要求其原型爲 FunPtr (*)(容器元素或其引用).
  3.   { 
  4. //這就是標準庫與本身寫的程序對正確性要求的區別,你使用標準庫,並非只要給出的參數類型表面上符合就好了,它可能會有一些隱含的條件.好比這裏.
  5.     for ( ; first!=last; ++first ) f(*first); 
  6.     return f; 
  7.   } 
連接:http://www.cplusplus.com/reference/algorithm/for_each/ 1  
最後附上一個程序驗證這一點:

  1. //####################################################################### 
  2. //# Created Time: 2011-3-7 18:02:35 
  3. //# File Name: for_each.cpp 
  4. //# Description:  
  5. //####################################################################### 
  6. #include <iostream> 
  7. #include <string> 
  8. #include <vector> 
  9. #include <map> 
  10. #include <algorithm> 
  11. using namespace std; 
  12. typedef std::vector<std::pair<std::string, std::string> > pv; 
  13. typedef pv::iterator pitr; 
  14. struct p{ 
  15.     void operator()(const pair<string, string> &v) const{ 
  16.         cout<<v.first<<"/t"<<v.second<<endl; 
  17.     } 
  18.     void operator()(int  a){ 
  19.         ++a; 
  20.     } 
  21. }; 
  22. void print(int n)  
  23.     cout << n << " "; 
  24. int main(){ 
  25.     pv v; 
  26.     vector<int>   ivec; 
  27.     for (int i=0; i < 10; i++) 
  28.         ivec.push_back(i); 
  29.      
  30.     v.push_back(make_pair("Hello, ", "the world!")); 
  31.     for_each(v.begin(), v.end(), p());  //這裏P是對象,而這裏應該給的是函數指針,因此調用對象的()運算符重載函數,至關於一個僞函數. 這裏的括號不能省略.
  32.     for_each(ivec.begin(), ivec.end(), p()); 
  33.     for_each(ivec.begin(), ivec.end(), print);  //這裏的print直接就是函數,使用時不用加括號.
  34.          
  35.     return 0; 
  36.   
編譯經過:
運行結構以下:
Hello,  the world!
0 1 2 3 4 5 6 7 8 9
參考:
  1. cplusplus網站:http://www.cplusplus.com/reference/algorithm/for_each/
相關文章
相關標籤/搜索