在容器类中使用自定义比较器的 C++ 排序集

Mic*_*ell 5 c++ sorting comparison set

我有一个有名字和年龄的类 Person 。

我有一个名为 people 的容器类,用于存储一组人员。

我创建了两个自定义比较器来按名称和年龄排序。

当我在我的类 (People) 中存储包含 Persons 的集合时,如何传入自定义比较器。

例如

我的比较器看起来像这样

struct compareByName
{
    bool operator()(const Person & Left, const Person & Right)
    {
        return (Left.getName() < Right.getName());
    }
};
Run Code Online (Sandbox Code Playgroud)

主要是如果我想按姓名对一组人进行排序,我只是这样做

set<Person, compareByName> peopleByName;
Run Code Online (Sandbox Code Playgroud)

或者我的年龄

set<Person, compareByAge> peopleByAge;
Run Code Online (Sandbox Code Playgroud)

我遇到麻烦的地方是如何在我的人员容器类中使用它我会有类似的东西

class People
{
private:
    set<Person, COMPARATOR> m_people;
}
Run Code Online (Sandbox Code Playgroud)

COMPARATOR 可以是名字或年龄

Sla*_*ica 7

您可以使用std::function作为比较器类型,然后为构造函数提供特定的比较器:

class People
{
    using PeopleSet = set<Person, std::function<bool(const Person &p1, const Person &p2 )>>;

    People() : people( compareByName() ) {}
    void sortByAge();
private:
    PeopleSet people; 
};
Run Code Online (Sandbox Code Playgroud)

请注意,创建集合后不能更改比较器,必须创建另一个实例:

void People::sortByAge()
{
    people = PeopleSet( people.begin(), people.end(), compareByAge() );
}
Run Code Online (Sandbox Code Playgroud)

这将涉及复制或移动整个集合。如果您希望能够同时使用两种方式,请boost::multi_index改用。