函数对象(Function Object)作为类对象的排序准则

由于经常需要将某些class object以排序(sorted)状态植入容器。
一般无法使用一般的operator <对这些对象排序,必须以某种规则(通常基于某些成员函数)来排序。

采用function object class自定义排序准则的实例:

#include <iostream>
#include <string>
#include <set>
#include <algorithm>

using namespace std;

class Person
{
public:
    string firstname() const;
    string lastname() const;
};

class PersonSortCriterion
{
public:
    bool operator() (const Person &p1, const Person &p2) const
    {
        return p1.lastname() < p2.lastname() ||
            (p1.lastname() == p2.lastname() &&
            p1.firstname() < p2.firstname());
    }
};

int main()
{
    //创建个set容器,并以PersonSortCriterion为排序准则
    set<Person, PersonSortCriterion> coll;

    for (auto pos = coll.begin(); pos != coll.end(); ++pos)
    {
        //...
    }
}

这里的set容器coll使用特殊排序准则PersonSortCriterion(一个function object class)。

PersonSortCriterion定义运算符()功能:
先比较两人的姓,若相等再比较其名。

coll构造函数会自动产生class PersonSortCriterion的一个实例,所有元素都将以此为排序准则进行排序。

注意:
排序准则PersonSortCriterion是个class,所以可以把它当作set的template实参。
若以一般函数担任排序准则,无法做到这一点。

“以上述类型作为排序准则”的所有set,都拥有属于自己独一无二类型。
不能将这个set和“拥有不同排序准则”的其他set合并或赋值。

你可能感兴趣的:(函数对象)