0.大纲
注意:函数对象和仿函数指的是一个东西.
1.Function Object(函数对象-仿函数)的概念
所谓function object(或者说functor),是一个定义了operator()的类的一个对象.
FunctionObjectType fo;
...
fo(...);?
!!!!注意:表达式fo()是调用函数对象fo的operator(),而非调用函数fo().?
函数对象的一般写法:
class FunctionObjectType
{
public:
void operator() ()
{
statements
}
};
1.1.1 仿函数相对于一般函数的优点
仿函数的优点:
1.仿函数是对象,可以拥有成员函数和成员变量,即仿函数拥有状态;
2.每个仿函数都有自己的类型;
3.仿函数通常比一般函数快(很多信息编译期确定).
1.1.2 以仿函数为排序准则?
#include <iostream>
#include <string>
#include <deque>
#include <set>
#include <algorithm>
using namespace std;
/*Person类*/
class Person
{
private:
string fn; // first name
string ln; // last name
public:
Person() {}
Person(const string &f, const string &n) : fn(f), ln(n) {}
string firstname() const;
string lastname() const;
};
inline string Person::firstname() const { return fn; }
inline string Person::lastname() const { return ln; }
ostream &operator<<(ostream &s, const Person &p)
{
s << "[" << p.firstname() << " " << p.lastname() << "]";
return s;
}
/* class for function predicate
* - operator () returns whether a person is less than another person
*/
class PersonSortCriterion
{
public:
bool operator()(const Person &p1, const Person &p2) const
{
/* a person is less than another person
* - if the last name is less
* - if the last name is equal and the first name is less
*/
return p1.lastname() < p2.lastname() ||
( p1.lastname() == p2.lastname()
&& p1.firstname() < p2.firstname());
}
};
int main()
{
Person p1("nicolai", "josuttis");
Person p2("ulli", "josuttis");
Person p3("anica", "josuttis");
Person p4("lucas", "josuttis");
Person p5("lucas", "otto");
Person p6("lucas", "arm");
Person p7("anica", "holle");
// declare set type with special sorting criterion
typedef set<Person, PersonSortCriterion> PersonSet;
// create such a collection
PersonSet coll;
coll.insert(p1);
coll.insert(p2);
coll.insert(p3);
coll.insert(p4);
coll.insert(p5);
coll.insert(p6);
coll.insert(p7);
// do something with the elements
// - in this case: output them
cout << "set:" << endl;
PersonSet::iterator pos;
for (pos = coll.begin(); pos != coll.end(); ++pos)
{
cout << *pos << endl;
}
}
/*
注释:
这里的set coll使用特殊排序准则 PersonSortCriterion,而它正是一个function object
class. PersonSortCriterion这么定义operator():先比较两人的姓,如果相等再比较其名.
coll构造函数会自动产生class PersonSortCriterion的一个实例(instance),所有元素都
将以此为排序准则进行排序.
注意,排序准则PersonSortCriterion是个class,所以你可以把它当作set的template实参.
如果以寻常函数担任排序准则,就无法做到这一点.
"以上述类型作为排序准则"的所有set,都拥有属于自己的独一无二的类型. 无法将这个set拿
来和"拥有不同排序准则"的其他set合并或赋值. 虽然无论做什么都无法回避set的自动排序特
性,但可以设计出"表现不同的排序准则却有着相同类型"的仿函数.
*/
|