//####################################################################### ios
編譯的時候提示: 函數
for_each(v.begin(), v.end(), p()); 這一句中類p中運算()不匹配。 網站
而有人給出了一個版本: spa
問題解決,編譯也經過。可是就是不明白爲何作樣作就能夠。 指針
剛開始不明白他的意思。後來才明白做爲for_each的函數的形參類型有特別的要求。 code
總結以下: for_each的形參的函數或者類對應的運算符()的形參的有兩點要求: 對象
第一:必須爲單參數; 接口
第二:必須跟*iter的類型一致或者兼容。既它的形參不能是迭代器或者指針。只能是對象或者它的引用。 ip
爲了考證這一點,我到cpluplus網站去看了for_each的接口定義。get
- 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
參考: