C ++列表一次按多个字段排序

时间:2019-02-18 15:04:48

标签: c++ linked-list

我想知道是否有一个很好的方法来获得同时按两个或多个不同条件排序的对象列表。例如,如果我有一堂课:

class Person {
    Person(const char *name, int age);
    float        age;
    char *       name;

    bool compareAge(person_t a) {return age < b.age;}
    bool compareName(person_t a) {return strcmp(name,a.name) < 0;}
};

我有一百万个名字。我想知道是否有任何可以使用人员列表的通用类,这样我可以按字母顺序或按年龄快速迭代并搜索该列表。因此,例如,我希望能够执行以下操作而无需在查找之间进行排序:

const std::multiset<Person, 2> mySet;
mySet.setSortCriteria(1, Person::compareName);
mySet.setSortCriteria(2, Person::compareAge);
populateAndSort(&mySet);

Person firstJohn = mySet.findByCriteria(1, Person("John",0));
Person firstTeen = mySet.findByCriteria(2, Person("",13));

我可以使用指向Person的两个单独的排序多组指针来完成此操作,但是理想情况下,我只想维护一个列表(因此,如果我要对20条条件进行查找,则无需维护20个清单...)。到目前为止,我还没有找到任何参考来找到实现此目的的好方法,但是,目前,我对C ++还是有些陌生,很可能会丢失一些东西。

1 个答案:

答案 0 :(得分:0)

在我们的贫穷世界中没有魔力……如果您希望根据不同的排序顺序访问同一列表,则需要维护多个索引。这就是数据库的工作方式:通常,您有一个主键(应该是 native 访问模式)和备用索引,这些索引允许对索引字段进行快速搜索和排序。在容器世界中,主键将是主容器的本机顺序,备用索引将是备用映射,其中,如果用于排序的字段和值将是主容器上的迭代器,则该键-至少对于那些不会使更改的迭代器无效的容器(例如列表和地图)。

您可以自己滚动。注意事项很少,主要是在修改主容器时正确维护所有索引。或者,如在注释中建议的那样,只需使用Boost。