//#######################################################################
- //# Created Time: 2011-3-7 18:02:35
- //# File Name: for_each.cpp
- //# Description:
- //#######################################################################
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- using namespace std;
- typedef std::vector<std::pair<std::string, std::string> > pv;
- typedef pv::iterator pitr;
- struct p{
- void operator()(const pitr &iter) const{
- cout<<iter->first<<"/t"<<iter->second<<endl;
- }
- };
- int main(){
- pv v;
- v.push_back(make_pair("Hello, ", "the world!"));
- for_each(v.begin(), v.end(), p());
- return 0;
- }
编译的时候提示:
for_each(v.begin(), v.end(), p()); 这一句中类p中运算()不匹配。
而有人给出了一个版本:
- struct p
- {
- void operator()(const pair<string,string>& itr) const{
- cout<<itr.first<<"/t"<<itr.second<<endl;
- }
- void operator()(int& a){
- ++a;
- }
- };
问题解决,编译也通过。但是就是不明白为什么做样做就可以。
刚开始不明白他的意思。后来才明白作为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
参考: