函数与函数子
在STL的使用中,我们经常需要自定义比较函数。本文将介绍如何完成这一类的函数,并且给出可靠而高效的使用建议。
1. mem_fun, ptr_fun, mem_fun_ref
mem_fun, ptr_fun, mem_fun_ref主要的任务是为了掩盖C++语言中一个内在的语法不一致的问题。
调用一个函数,C++提供了三种方法。
f(x); // 语法1:非成员函数的调用。
x.f(); // 语法2:成员函数的调用。
p->f(); // 语法3:指针调用成员函数。
对于语法1:
#include <iostream>
#include <vector>
using namespace std;
class Widget {
public:
};
void test(const Widget& one) {
cout << "test fine!" << endl;
}
int main() {
vector<Widget> vw;
for_each(vw.begin(), vw.end(), ptr_fun(test)); // 这里是不是用ptr_fun都没有问题。
return 0;
}
对于语法2:上面的写法就不再合适了,后文给出相应解释。正确的做法如下,调用mem_fun_ref。
#include <iostream>
#include <vector>
using namespace std;
class Widget {
public:
void test() {
cout << "test fine!" << endl;
}
};
int main() {
vector<Widget> vw;
for_each(vw.begin(), vw.end(), mem_fun_ref(&Widget::test));
return 0;
}
对于语法3:
#include <iostream>
#include <vector>
using namespace std;
class Widget {
public:
void test() {
cout << "test fine!" << endl;
}
};